@zihanw/pi-forge 0.5.3 → 0.5.5

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 (241) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/README.md +67 -103
  3. package/README.zh-CN.md +67 -95
  4. package/assets/pi-forge-header-concept-1.png +0 -0
  5. package/assets/readme/PROVENANCE.md +95 -0
  6. package/assets/readme/en/capability-tools.gif +0 -0
  7. package/assets/readme/en/context-composition.gif +0 -0
  8. package/assets/readme/en/context-toggle.gif +0 -0
  9. package/assets/readme/en/draft-diff.png +0 -0
  10. package/assets/readme/en/edit-draft-diff.gif +0 -0
  11. package/assets/readme/en/editor-overview-v3.png +0 -0
  12. package/assets/readme/en/editor-overview.png +0 -0
  13. package/assets/readme/en/mode-tools.gif +0 -0
  14. package/assets/readme/en/regex-transforms.gif +0 -0
  15. package/assets/readme/en/tool-selection.gif +0 -0
  16. package/assets/readme/tui-quickstart.gif +0 -0
  17. package/assets/readme/zh-CN/capability-tools.gif +0 -0
  18. package/assets/readme/zh-CN/context-composition.gif +0 -0
  19. package/assets/readme/zh-CN/context-toggle.gif +0 -0
  20. package/assets/readme/zh-CN/draft-diff.png +0 -0
  21. package/assets/readme/zh-CN/edit-draft-diff.gif +0 -0
  22. package/assets/readme/zh-CN/editor-overview-v3.png +0 -0
  23. package/assets/readme/zh-CN/editor-overview.png +0 -0
  24. package/assets/readme/zh-CN/mode-tools.gif +0 -0
  25. package/assets/readme/zh-CN/regex-transforms.gif +0 -0
  26. package/assets/readme/zh-CN/tool-selection.gif +0 -0
  27. package/dist/active-state.d.ts +148 -0
  28. package/dist/active-state.d.ts.map +1 -0
  29. package/dist/active-state.js +374 -0
  30. package/dist/active-state.js.map +1 -0
  31. package/dist/agent-profile.d.ts.map +1 -1
  32. package/dist/agent-profile.js +11 -0
  33. package/dist/agent-profile.js.map +1 -1
  34. package/dist/capabilities.d.ts +39 -0
  35. package/dist/capabilities.d.ts.map +1 -0
  36. package/dist/capabilities.js +160 -0
  37. package/dist/capabilities.js.map +1 -0
  38. package/dist/capability-anchors.d.ts +45 -0
  39. package/dist/capability-anchors.d.ts.map +1 -0
  40. package/dist/capability-anchors.js +263 -0
  41. package/dist/capability-anchors.js.map +1 -0
  42. package/dist/capability-command.d.ts +4 -0
  43. package/dist/capability-command.d.ts.map +1 -0
  44. package/dist/capability-command.js +164 -0
  45. package/dist/capability-command.js.map +1 -0
  46. package/dist/capability-events.d.ts +79 -0
  47. package/dist/capability-events.d.ts.map +1 -0
  48. package/dist/capability-events.js +478 -0
  49. package/dist/capability-events.js.map +1 -0
  50. package/dist/capability-projection.d.ts +22 -0
  51. package/dist/capability-projection.d.ts.map +1 -0
  52. package/dist/capability-projection.js +273 -0
  53. package/dist/capability-projection.js.map +1 -0
  54. package/dist/capability-protocol.d.ts +21 -0
  55. package/dist/capability-protocol.d.ts.map +1 -0
  56. package/dist/capability-protocol.js +15 -0
  57. package/dist/capability-protocol.js.map +1 -0
  58. package/dist/capability-state.d.ts +74 -0
  59. package/dist/capability-state.d.ts.map +1 -0
  60. package/dist/capability-state.js +43 -0
  61. package/dist/capability-state.js.map +1 -0
  62. package/dist/capability-tool.d.ts +11 -0
  63. package/dist/capability-tool.d.ts.map +1 -0
  64. package/dist/capability-tool.js +25 -0
  65. package/dist/capability-tool.js.map +1 -0
  66. package/dist/capability-web-host.d.ts +11 -0
  67. package/dist/capability-web-host.d.ts.map +1 -0
  68. package/dist/capability-web-host.js +105 -0
  69. package/dist/capability-web-host.js.map +1 -0
  70. package/dist/codecs/capability.d.ts +71 -0
  71. package/dist/codecs/capability.d.ts.map +1 -0
  72. package/dist/codecs/capability.js +363 -0
  73. package/dist/codecs/capability.js.map +1 -0
  74. package/dist/codecs/prompt-stack.d.ts +1 -1
  75. package/dist/codecs/prompt-stack.d.ts.map +1 -1
  76. package/dist/codecs/prompt-stack.js +140 -13
  77. package/dist/codecs/prompt-stack.js.map +1 -1
  78. package/dist/command-contribution/index.d.ts +21 -0
  79. package/dist/command-contribution/index.d.ts.map +1 -0
  80. package/dist/command-contribution/index.js +14 -0
  81. package/dist/command-contribution/index.js.map +1 -0
  82. package/dist/compile-cycle.d.ts +7 -1
  83. package/dist/compile-cycle.d.ts.map +1 -1
  84. package/dist/compile-cycle.js +2 -0
  85. package/dist/compile-cycle.js.map +1 -1
  86. package/dist/compiler.d.ts +7 -1
  87. package/dist/compiler.d.ts.map +1 -1
  88. package/dist/compiler.js +140 -19
  89. package/dist/compiler.js.map +1 -1
  90. package/dist/context-diff-history.d.ts +2 -0
  91. package/dist/context-diff-history.d.ts.map +1 -1
  92. package/dist/context-diff-history.js +9 -0
  93. package/dist/context-diff-history.js.map +1 -1
  94. package/dist/forge-command.d.ts +10 -0
  95. package/dist/forge-command.d.ts.map +1 -0
  96. package/dist/forge-command.js +106 -0
  97. package/dist/forge-command.js.map +1 -0
  98. package/dist/index.d.ts +2 -2
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +58 -7
  101. package/dist/index.js.map +1 -1
  102. package/dist/json-fingerprint.d.ts +11 -0
  103. package/dist/json-fingerprint.d.ts.map +1 -0
  104. package/dist/json-fingerprint.js +66 -0
  105. package/dist/json-fingerprint.js.map +1 -0
  106. package/dist/lifecycle.d.ts +14 -0
  107. package/dist/lifecycle.d.ts.map +1 -1
  108. package/dist/lifecycle.js +175 -66
  109. package/dist/lifecycle.js.map +1 -1
  110. package/dist/payload-command.d.ts +2 -2
  111. package/dist/payload-command.d.ts.map +1 -1
  112. package/dist/payload-command.js +80 -26
  113. package/dist/payload-command.js.map +1 -1
  114. package/dist/payload-state.d.ts +1 -0
  115. package/dist/payload-state.d.ts.map +1 -1
  116. package/dist/payload-state.js +1 -0
  117. package/dist/payload-state.js.map +1 -1
  118. package/dist/policy.d.ts +2 -1
  119. package/dist/policy.d.ts.map +1 -1
  120. package/dist/policy.js +3 -0
  121. package/dist/policy.js.map +1 -1
  122. package/dist/preset-command.d.ts +2 -0
  123. package/dist/preset-command.d.ts.map +1 -1
  124. package/dist/preset-command.js +101 -36
  125. package/dist/preset-command.js.map +1 -1
  126. package/dist/preview-text.d.ts +5 -0
  127. package/dist/preview-text.d.ts.map +1 -0
  128. package/dist/preview-text.js +27 -0
  129. package/dist/preview-text.js.map +1 -0
  130. package/dist/preview.d.ts +18 -1
  131. package/dist/preview.d.ts.map +1 -1
  132. package/dist/preview.js +134 -99
  133. package/dist/preview.js.map +1 -1
  134. package/dist/profile-command.d.ts +4 -1
  135. package/dist/profile-command.d.ts.map +1 -1
  136. package/dist/profile-command.js +77 -14
  137. package/dist/profile-command.js.map +1 -1
  138. package/dist/prompt-cache-warning.d.ts +23 -0
  139. package/dist/prompt-cache-warning.d.ts.map +1 -0
  140. package/dist/prompt-cache-warning.js +74 -0
  141. package/dist/prompt-cache-warning.js.map +1 -0
  142. package/dist/regex.d.ts.map +1 -1
  143. package/dist/regex.js +5 -0
  144. package/dist/regex.js.map +1 -1
  145. package/dist/render-helpers.d.ts.map +1 -1
  146. package/dist/render-helpers.js +2 -0
  147. package/dist/render-helpers.js.map +1 -1
  148. package/dist/repositories/capability.d.ts +53 -0
  149. package/dist/repositories/capability.d.ts.map +1 -0
  150. package/dist/repositories/capability.js +294 -0
  151. package/dist/repositories/capability.js.map +1 -0
  152. package/dist/runtime/capability-runtime.d.ts +91 -0
  153. package/dist/runtime/capability-runtime.d.ts.map +1 -0
  154. package/dist/runtime/capability-runtime.js +967 -0
  155. package/dist/runtime/capability-runtime.js.map +1 -0
  156. package/dist/runtime/tool-policy-runtime.d.ts +8 -0
  157. package/dist/runtime/tool-policy-runtime.d.ts.map +1 -1
  158. package/dist/runtime/tool-policy-runtime.js +171 -30
  159. package/dist/runtime/tool-policy-runtime.js.map +1 -1
  160. package/dist/session-adapter.d.ts +13 -0
  161. package/dist/session-adapter.d.ts.map +1 -1
  162. package/dist/session-adapter.js +110 -0
  163. package/dist/session-adapter.js.map +1 -1
  164. package/dist/session-usage.d.ts +65 -0
  165. package/dist/session-usage.d.ts.map +1 -0
  166. package/dist/session-usage.js +134 -0
  167. package/dist/session-usage.js.map +1 -0
  168. package/dist/subagent/fingerprints.d.ts +3 -15
  169. package/dist/subagent/fingerprints.d.ts.map +1 -1
  170. package/dist/subagent/fingerprints.js +5 -69
  171. package/dist/subagent/fingerprints.js.map +1 -1
  172. package/dist/subagent/index.d.ts +2 -0
  173. package/dist/subagent/index.d.ts.map +1 -1
  174. package/dist/subagent/index.js +2 -0
  175. package/dist/subagent/index.js.map +1 -1
  176. package/dist/subagent-host.d.ts +2 -2
  177. package/dist/subagent-host.d.ts.map +1 -1
  178. package/dist/subagent-host.js +13 -1
  179. package/dist/subagent-host.js.map +1 -1
  180. package/dist/types.d.ts +6 -1
  181. package/dist/types.d.ts.map +1 -1
  182. package/dist/types.js.map +1 -1
  183. package/dist/web-editor/client-script.generated.d.ts.map +1 -1
  184. package/dist/web-editor/client-script.generated.js +1 -1
  185. package/dist/web-editor/client-script.generated.js.map +1 -1
  186. package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
  187. package/dist/web-editor/client-styles.generated.js +1 -1
  188. package/dist/web-editor/client-styles.generated.js.map +1 -1
  189. package/dist/web-editor/server.d.ts.map +1 -1
  190. package/dist/web-editor/server.js +152 -4
  191. package/dist/web-editor/server.js.map +1 -1
  192. package/dist/web-editor/styles.d.ts.map +1 -1
  193. package/dist/web-editor/styles.js +521 -116
  194. package/dist/web-editor/styles.js.map +1 -1
  195. package/dist/web-editor/types.d.ts +81 -1
  196. package/dist/web-editor/types.d.ts.map +1 -1
  197. package/dist/web-host.d.ts +7 -0
  198. package/dist/web-host.d.ts.map +1 -1
  199. package/dist/web-host.js +168 -5
  200. package/dist/web-host.js.map +1 -1
  201. package/dist/workspace.d.ts +11 -0
  202. package/dist/workspace.d.ts.map +1 -1
  203. package/dist/workspace.js +63 -5
  204. package/dist/workspace.js.map +1 -1
  205. package/docs/README.md +4 -0
  206. package/docs/design/README.md +3 -1
  207. package/docs/design/architecture-0.5.md +22 -0
  208. package/docs/design/archive/2026-09-12-system-update-design.md +229 -0
  209. package/docs/design/pi-forge-system-update-design-notes.md +157 -0
  210. package/docs/development/release.md +20 -20
  211. package/docs/development/roadmap.md +17 -2
  212. package/docs/development/scoped-global-profiles-stacks.md +1 -1
  213. package/docs/development/setup.md +1 -1
  214. package/docs/getting-started.md +1 -1
  215. package/docs/guides/delegation.md +22 -20
  216. package/docs/guides/migrating-to-0.5.md +29 -0
  217. package/docs/guides/use-cases.md +6 -2
  218. package/docs/guides/web-editor.md +73 -5
  219. package/docs/reference/active-state.md +77 -0
  220. package/docs/reference/capabilities.md +259 -0
  221. package/docs/reference/commands.md +52 -24
  222. package/docs/reference/configuration.md +4 -2
  223. package/docs/reference/features.md +70 -4
  224. package/docs/reference/provider-support.md +67 -0
  225. package/docs/reference/public-api.md +49 -3
  226. package/docs/reference/session-cache.md +112 -0
  227. package/docs/reference/stack-schema.md +18 -4
  228. package/docs/reference/subagent-host-port.md +8 -0
  229. package/docs/zh-CN/README.md +3 -0
  230. package/docs/zh-CN/getting-started.md +1 -1
  231. package/docs/zh-CN/guides/delegation.md +22 -10
  232. package/docs/zh-CN/guides/migrating-to-0.5.md +29 -0
  233. package/docs/zh-CN/guides/web-editor.md +74 -7
  234. package/docs/zh-CN/reference/capabilities.md +259 -0
  235. package/docs/zh-CN/reference/commands.md +61 -33
  236. package/docs/zh-CN/reference/provider-support.md +67 -0
  237. package/docs/zh-CN/reference/session-cache.md +112 -0
  238. package/examples/capabilities/review.json +12 -0
  239. package/examples/capabilities/write-tools.json +15 -0
  240. package/examples/read-first-worker-prompt-stack.json +49 -0
  241. package/package.json +16 -9
package/dist/index.js CHANGED
@@ -1,3 +1,7 @@
1
+ import { registerForgeCommand } from "./forge-command.js";
2
+ import { createCapabilityRuntime } from "./runtime/capability-runtime.js";
3
+ import { registerCapabilityCommand } from "./capability-command.js";
4
+ import { registerCapabilityTool } from "./capability-tool.js";
1
5
  import { registerLifecycleHandlers } from "./lifecycle.js";
2
6
  import { registerPayloadCommands, registerPayloadRequestHandler, armPayloadIntercept, clearPayloadCapture, recordProviderResponseUsage, webPayloadSnapshot } from "./payload-command.js";
3
7
  import { buildPreview } from "./preview.js";
@@ -5,37 +9,65 @@ import { registerPresetCommand } from "./preset-command.js";
5
9
  import { registerProfileCommand } from "./profile-command.js";
6
10
  import { applyResolvedAgentProfile } from "./profile-service.js";
7
11
  import { formatResourceKey } from "./resource-identity.js";
12
+ import { ForgeActiveStatePublisher } from "./active-state.js";
8
13
  import { createProfileRuntime } from "./runtime/profile-runtime.js";
9
14
  import { createPromptStackRuntime } from "./runtime/prompt-stack-runtime.js";
10
15
  import { ForgeWorkspace } from "./workspace.js";
11
16
  import { createToolPolicyRuntime } from "./runtime/tool-policy-runtime.js";
12
17
  import { createWebEditorRuntime } from "./runtime/web-editor-runtime.js";
13
18
  import { createCompileCycleState } from "./compile-cycle.js";
14
- import { getContextDiffView } from "./context-diff-history.js";
19
+ import { getContextDiffView, getLatestContextDiffUsage } from "./context-diff-history.js";
15
20
  import { createPayloadState } from "./payload-state.js";
16
21
  /**
17
22
  * Intentional public surface (0.5.0): the default Pi extension factory plus
18
23
  * the trusted-extension API (`registerMacro`/`registerSlot` and their contract
19
- * types). Everything else is internal; the only other entry point is
20
- * `@zihanw/pi-forge/subagent`, the versioned host port.
24
+ * types). Other intentional entries are the /subagent and /ui-contribution ports
25
+ * and the local /command-contribution contract. Everything else is internal.
21
26
  */
22
27
  export { registerMacro, } from "./macro-engine.js";
23
28
  export { registerSlot, } from "./slot-renderers.js";
24
29
  export default function piForge(pi) {
25
30
  const workspace = new ForgeWorkspace();
31
+ const activeState = new ForgeActiveStatePublisher({
32
+ transport: pi.events,
33
+ readWorkspace: () => {
34
+ if (!workspace.snapshotKnown)
35
+ return { stackKey: null };
36
+ const snapshot = workspace.snapshot();
37
+ return {
38
+ stackKey: snapshot.active ? formatResourceKey(snapshot.active.key) : null,
39
+ profile: snapshot.lastAppliedProfile
40
+ ? {
41
+ profileId: snapshot.lastAppliedProfile.profileId,
42
+ scope: snapshot.lastAppliedProfile.scope,
43
+ promptStack: snapshot.lastAppliedProfile.snapshot.promptStack,
44
+ }
45
+ : undefined,
46
+ };
47
+ },
48
+ });
49
+ // Optional observer: publishes on reload, active-stack/profile changes, and
50
+ // web-editor mutations without any provider/model/tool-policy side effect.
51
+ workspace.subscribe(() => activeState.publish());
26
52
  const compileCycle = createCompileCycleState();
27
53
  const payloadState = createPayloadState();
28
54
  const currentActive = () => workspace.snapshotKnown ? workspace.snapshot().active : undefined;
29
55
  const toolPolicy = createToolPolicyRuntime(pi, () => currentActive());
56
+ const instructions = createCapabilityRuntime(pi, workspace, toolPolicy);
30
57
  let profileRuntime;
31
58
  const stackRuntime = createPromptStackRuntime(pi, workspace, compileCycle, {
32
- syncToolPolicy: toolPolicy.sync,
59
+ syncToolPolicy: instructions.sync,
33
60
  });
34
61
  profileRuntime = createProfileRuntime(pi, workspace, {
35
62
  setActive: (id, ctx) => stackRuntime.setActive(id, ctx),
36
63
  updateStatus: stackRuntime.updateStatus,
37
64
  });
38
65
  const webEditorRuntime = createWebEditorRuntime((ctx, promptOptions) => ({
66
+ readCapabilities: () => workspace.reloadCapabilities(ctx.cwd, ctx.isProjectTrusted()).capabilities,
67
+ readCapabilityState: () => instructions.readState(),
68
+ readCapabilityChoices: () => instructions.readAvailableCapabilities(),
69
+ mutateCapabilityState: (input) => instructions.mutateState(input),
70
+ enableCapability: (input) => instructions.enableCapability(input),
39
71
  getStacks: () => [...workspace.snapshot().stacks],
40
72
  getActive: () => currentActive(),
41
73
  getActiveId: stackRuntime.activeId,
@@ -77,7 +109,18 @@ export default function piForge(pi) {
77
109
  activateFreshSessionDefaults: profileRuntime.activateFreshSessionDefaults,
78
110
  refreshWebEditorHost: webEditorRuntime.refreshHost,
79
111
  notifyActivePreset: stackRuntime.notifyActivePreset,
80
- syncActiveToolPolicy: toolPolicy.sync,
112
+ syncActiveToolPolicy: instructions.sync,
113
+ disposeCapabilities: instructions.dispose,
114
+ prepareCapabilityRestore: instructions.prepareRestore,
115
+ restoreCapabilities: instructions.restore,
116
+ projectCapabilities: instructions.project,
117
+ prepareCapabilityMessages: instructions.prepareMessages,
118
+ commitEndCapabilityAnchors: instructions.commitEndAnchors,
119
+ setCapabilityAgentBusy: instructions.setAgentBusy,
120
+ toolPromptOptions: (options) => {
121
+ const active = currentActive();
122
+ return active ? toolPolicy.previewOptions({ ...options, selectedTools: pi.getActiveTools() }, active.stack) : options;
123
+ },
81
124
  restoreActiveToolPolicy: toolPolicy.restore,
82
125
  toolPolicyBlockReason: toolPolicy.blockReason,
83
126
  persistActiveSelection: stackRuntime.persistActiveSelection,
@@ -87,22 +130,30 @@ export default function piForge(pi) {
87
130
  workspace.startHostPort(pi.events);
88
131
  },
89
132
  disposeForgeWorkspace: () => workspace.dispose(),
133
+ suspendActiveState: () => activeState.suspend(),
134
+ bindActiveState: (ctx) => activeState.bindSession({ sessionId: ctx.sessionManager.getSessionId(), cwd: ctx.cwd }),
135
+ disposeActiveState: () => activeState.dispose(),
90
136
  recordProviderResponseUsage: (message) => recordProviderResponseUsage(payloadState, message),
91
137
  });
92
138
  registerPayloadRequestHandler(pi, payloadState, () => currentActive());
93
- registerPayloadCommands(pi, payloadState);
139
+ registerCapabilityCommand(pi, instructions);
140
+ registerCapabilityTool(pi, instructions);
141
+ const payloadCommand = registerPayloadCommands(pi, payloadState);
142
+ registerForgeCommand(pi, { openWebEditor: webEditorRuntime.open, stopWebEditor: webEditorRuntime.stop }, payloadCommand);
94
143
  registerPresetCommand(pi, workspace, compileCycle, {
95
144
  selectedActiveId: stackRuntime.selectedActiveId,
96
145
  setActive: stackRuntime.setActive,
97
146
  reloadStacks: stackRuntime.reloadStacks,
98
147
  openWebEditor: webEditorRuntime.open,
99
148
  stopWebEditor: webEditorRuntime.stop,
149
+ latestContextDiffUsage: () => getLatestContextDiffUsage(payloadState.contextDiffHistory),
100
150
  });
101
- registerProfileCommand(pi, workspace, {
151
+ registerProfileCommand(pi, workspace, compileCycle, {
102
152
  reloadProfiles: profileRuntime.reloadProfiles,
103
153
  resolveProfile: profileRuntime.resolveProfile,
104
154
  setActive: stackRuntime.setActive,
105
155
  previewToolNames: toolPolicy.previewToolNames,
156
+ latestContextDiffUsage: () => getLatestContextDiffUsage(payloadState.contextDiffHistory),
106
157
  });
107
158
  }
108
159
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzL,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAuB,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;GAKG;AACH,OAAO,EACN,aAAa,GAIb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,YAAY,GAIZ,MAAM,qBAAqB,CAAC;AAoB7B,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAAgB;IAC/C,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,yBAAyB,CAAC;QACjD,SAAS,EAAE,EAAE,CAAC,MAAM;QACpB,aAAa,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,SAAS,CAAC,aAAa;gBAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO;gBACN,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;gBACzE,OAAO,EAAE,QAAQ,CAAC,kBAAkB;oBACnC,CAAC,CAAC;wBACD,SAAS,EAAE,QAAQ,CAAC,kBAAkB,CAAC,SAAS;wBAChD,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,KAAK;wBACxC,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,CAAC,WAAW;qBAC7D;oBACD,CAAC,CAAC,SAAS;aACZ,CAAC;QACH,CAAC;KACD,CAAC,CAAC;IACH,4EAA4E;IAC5E,2EAA2E;IAC3E,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,MAAM,UAAU,GAAG,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,uBAAuB,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACxE,IAAI,cAA8B,CAAC;IACnC,MAAM,YAAY,GAAG,wBAAwB,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;QAC1E,cAAc,EAAE,YAAY,CAAC,IAAI;KACjC,CAAC,CAAC;IACH,cAAc,GAAG,oBAAoB,CAAC,EAAE,EAAE,SAAS,EAAE;QACpD,SAAS,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC;QACvD,YAAY,EAAE,YAAY,CAAC,YAAY;KACvC,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,CAAC,GAAqB,EAAE,aAAuC,EAAE,EAAE,CAAC,CAAC;QACpH,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,YAAY;QAClG,mBAAmB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE;QACnD,qBAAqB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,yBAAyB,EAAE;QACrE,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC;QACjE,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACjE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;QACjD,SAAS,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE;QAChC,WAAW,EAAE,YAAY,CAAC,QAAQ;QAClC,mBAAmB,EAAE,YAAY,CAAC,gBAAgB;QAClD,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC;QAClD,YAAY,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC;QAC1E,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3G,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,aAAa,CAAC;QACnE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;QACrD,qBAAqB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,kBAAkB;QACpE,wBAAwB,EAAE,GAAG,EAAE;YAC9B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;YAC/B,OAAO;gBACN,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC5E,aAAa,EAAE,EAAE,CAAC,gBAAgB,EAAE;gBACpC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC1D,cAAc,EAAE,EAAE,CAAC,cAAc,EAAE;aACnC,CAAC;QACH,CAAC;QACD,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC;QACtE,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAC/D,cAAc,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC;QACxD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE;QAC9D,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,yBAAyB,CACpD,EAAE,EACF,SAAS,EACT,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EACtD,QAAQ,EACR,GAAG,CACH;QACD,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QACrE,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;YACxB,mBAAmB,CAAC,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,YAAY,EAAE,GAAG,EAAE;YAClB,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC;KAC5F,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAErB,yBAAyB,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;QACtD,YAAY,EAAE,YAAY,CAAC,YAAY;QACvC,yBAAyB,EAAE,YAAY,CAAC,OAAO;QAC/C,4BAA4B,EAAE,cAAc,CAAC,4BAA4B;QACzE,oBAAoB,EAAE,gBAAgB,CAAC,WAAW;QAClD,kBAAkB,EAAE,YAAY,CAAC,kBAAkB;QACnD,oBAAoB,EAAE,YAAY,CAAC,IAAI;QACvC,mBAAmB,EAAE,YAAY,CAAC,OAAO;QACzC,wBAAwB,EAAE,YAAY,CAAC,cAAc;QACrD,mBAAmB,EAAE,YAAY,CAAC,OAAO;QACzC,mBAAmB,EAAE,YAAY,CAAC,OAAO;QACzC,yBAAyB,EAAE,YAAY,CAAC,eAAe;QACvD,0BAA0B,EAAE,YAAY,CAAC,gBAAgB;QACzD,sBAAsB,EAAE,YAAY,CAAC,YAAY;QACjD,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACvH,CAAC;QACD,uBAAuB,EAAE,UAAU,CAAC,OAAO;QAC3C,qBAAqB,EAAE,UAAU,CAAC,WAAW;QAC7C,sBAAsB,EAAE,YAAY,CAAC,sBAAsB;QAC3D,wBAAwB,EAAE,YAAY,CAAC,wBAAwB;QAC/D,wBAAwB,EAAE,YAAY,CAAC,wBAAwB;QAC/D,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE;YAC7B,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,qBAAqB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE;QAChD,kBAAkB,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE;QAC/C,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QACjH,kBAAkB,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE;QAC/C,2BAA2B,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,2BAA2B,CAAC,YAAY,EAAE,OAAO,CAAC;KAC5F,CAAC,CAAC;IACH,6BAA6B,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IACvE,yBAAyB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC5C,sBAAsB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,uBAAuB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACjE,oBAAoB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,gBAAgB,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;IACzH,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;QAClD,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;QAC/C,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,YAAY,EAAE,YAAY,CAAC,YAAY;QACvC,aAAa,EAAE,gBAAgB,CAAC,IAAI;QACpC,aAAa,EAAE,gBAAgB,CAAC,IAAI;QACpC,sBAAsB,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,YAAY,CAAC,kBAAkB,CAAC;KACxF,CAAC,CAAC;IACH,sBAAsB,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;QACnD,cAAc,EAAE,cAAc,CAAC,cAAc;QAC7C,cAAc,EAAE,cAAc,CAAC,cAAc;QAC7C,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,sBAAsB,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,YAAY,CAAC,kBAAkB,CAAC;KACxF,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Forge canonical JSON fingerprints shared by instruction snapshots and the
3
+ * existing subagent wire adapter. The algorithm is unchanged: sorted plain
4
+ * objects, finite numbers, no cycles or sparse arrays. This is content identity,
5
+ * not an authentication signature.
6
+ */
7
+ export declare const JSON_FINGERPRINT_PREFIX: "sha256:v1:";
8
+ export type JsonFingerprint = `${typeof JSON_FINGERPRINT_PREFIX}${string}`;
9
+ export declare function canonicalJson(value: unknown): string;
10
+ export declare function fingerprintJson(value: unknown): JsonFingerprint;
11
+ //# sourceMappingURL=json-fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-fingerprint.d.ts","sourceRoot":"","sources":["../src/json-fingerprint.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAG,YAAqB,CAAC;AAC7D,MAAM,MAAM,eAAe,GAAG,GAAG,OAAO,uBAAuB,GAAG,MAAM,EAAE,CAAC;AAE3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAK/D"}
@@ -0,0 +1,66 @@
1
+ import { createHash } from "node:crypto";
2
+ /**
3
+ * Forge canonical JSON fingerprints shared by instruction snapshots and the
4
+ * existing subagent wire adapter. The algorithm is unchanged: sorted plain
5
+ * objects, finite numbers, no cycles or sparse arrays. This is content identity,
6
+ * not an authentication signature.
7
+ */
8
+ export const JSON_FINGERPRINT_PREFIX = "sha256:v1:";
9
+ export function canonicalJson(value) {
10
+ return canonicalize(value, "$", new Set());
11
+ }
12
+ export function fingerprintJson(value) {
13
+ const digest = createHash("sha256")
14
+ .update(canonicalJson(value))
15
+ .digest("hex");
16
+ return `${JSON_FINGERPRINT_PREFIX}${digest}`;
17
+ }
18
+ function canonicalize(value, path, ancestors) {
19
+ if (value === null)
20
+ return "null";
21
+ if (typeof value === "string" || typeof value === "boolean") {
22
+ return JSON.stringify(value);
23
+ }
24
+ if (typeof value === "number") {
25
+ if (!Number.isFinite(value)) {
26
+ throw new TypeError(`Cannot fingerprint non-finite number at ${path}.`);
27
+ }
28
+ return JSON.stringify(Object.is(value, -0) ? 0 : value);
29
+ }
30
+ if (typeof value !== "object" || value === undefined) {
31
+ throw new TypeError(`Cannot fingerprint ${typeof value} at ${path}.`);
32
+ }
33
+ if (ancestors.has(value)) {
34
+ throw new TypeError(`Cannot fingerprint cyclic value at ${path}.`);
35
+ }
36
+ ancestors.add(value);
37
+ try {
38
+ if (Array.isArray(value)) {
39
+ const items = [];
40
+ for (let index = 0; index < value.length; index += 1) {
41
+ if (!Object.hasOwn(value, index)) {
42
+ throw new TypeError(`Cannot fingerprint sparse array item at ${path}[${index}].`);
43
+ }
44
+ items.push(canonicalize(value[index], `${path}[${index}]`, ancestors));
45
+ }
46
+ return `[${items.join(",")}]`;
47
+ }
48
+ const prototype = Object.getPrototypeOf(value);
49
+ if (prototype !== Object.prototype && prototype !== null) {
50
+ throw new TypeError(`Cannot fingerprint non-plain object at ${path}.`);
51
+ }
52
+ const record = value;
53
+ const keys = Object.keys(record)
54
+ .filter((key) => record[key] !== undefined)
55
+ .sort();
56
+ const properties = keys.map((key) => {
57
+ const property = canonicalize(record[key], `${path}.${key}`, ancestors);
58
+ return `${JSON.stringify(key)}:${property}`;
59
+ });
60
+ return `{${properties.join(",")}}`;
61
+ }
62
+ finally {
63
+ ancestors.delete(value);
64
+ }
65
+ }
66
+ //# sourceMappingURL=json-fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-fingerprint.js","sourceRoot":"","sources":["../src/json-fingerprint.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { BuildSystemPromptOptions, ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+ import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
3
  import type { AssistantMessage } from "@earendil-works/pi-ai";
3
4
  import { type CompileCycleState } from "./compile-cycle.ts";
4
5
  import type { ForgeWorkspace } from "./workspace.ts";
@@ -20,7 +21,20 @@ export interface LifecycleDeps {
20
21
  restorePersistedActiveId(id?: string): void;
21
22
  reloadForgeWorkspace(ctx: ExtensionContext): void;
22
23
  disposeForgeWorkspace(): void;
24
+ suspendActiveState(): void;
25
+ bindActiveState(ctx: ExtensionContext): void;
26
+ disposeActiveState(): void;
23
27
  recordProviderResponseUsage(message: AssistantMessage): void;
28
+ disposeCapabilities?(): void;
29
+ prepareCapabilityRestore?(ctx: ExtensionContext): void;
30
+ restoreCapabilities?(ctx: ExtensionContext, options?: {
31
+ deferToolPolicy?: boolean;
32
+ }): void;
33
+ projectCapabilities?(messages: AgentMessage[], ctx: ExtensionContext): AgentMessage[];
34
+ prepareCapabilityMessages?(raw: AgentMessage[], ctx: ExtensionContext): AgentMessage[];
35
+ commitEndCapabilityAnchors?(ctx: ExtensionContext): void;
36
+ setCapabilityAgentBusy?(busy: boolean): void;
37
+ toolPromptOptions?(options: BuildSystemPromptOptions): BuildSystemPromptOptions;
24
38
  }
25
39
  export declare function registerLifecycleHandlers(pi: ExtensionAPI, workspace: ForgeWorkspace, compileCycle: CompileCycleState, deps: LifecycleDeps): void;
26
40
  //# sourceMappingURL=lifecycle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,gBAAgB,EAAqB,MAAM,iCAAiC,CAAC;AACnI,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ9D,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,aAAa;IAC7B,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClJ,yBAAyB,IAAI,qBAAqB,EAAE,CAAC;IACrD,4BAA4B,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC5F,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChE,oBAAoB,CAAC,GAAG,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnD,uBAAuB,IAAI,IAAI,CAAC;IAChC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5D,sBAAsB,IAAI,IAAI,CAAC;IAC/B,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC;IAC5F,wBAAwB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClD,qBAAqB,IAAI,IAAI,CAAC;IAC9B,2BAA2B,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC7D;AAED,wBAAgB,yBAAyB,CACxC,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,iBAAiB,EAC/B,IAAI,EAAE,aAAa,GACjB,IAAI,CAoIN"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,gBAAgB,EAAqB,MAAM,iCAAiC,CAAC;AACnI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ9D,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,aAAa;IAC7B,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClJ,yBAAyB,IAAI,qBAAqB,EAAE,CAAC;IACrD,4BAA4B,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC5F,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChE,oBAAoB,CAAC,GAAG,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnD,uBAAuB,IAAI,IAAI,CAAC;IAChC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5D,sBAAsB,IAAI,IAAI,CAAC;IAC/B,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC;IAC5F,wBAAwB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClD,qBAAqB,IAAI,IAAI,CAAC;IAC9B,kBAAkB,IAAI,IAAI,CAAC;IAC3B,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC7C,kBAAkB,IAAI,IAAI,CAAC;IAC3B,2BAA2B,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC7D,mBAAmB,CAAC,IAAI,IAAI,CAAC;IAC7B,wBAAwB,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvD,mBAAmB,CAAC,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3F,mBAAmB,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAAC;IACtF,yBAAyB,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAAC;IACvF,0BAA0B,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzD,sBAAsB,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,iBAAiB,CAAC,CAAC,OAAO,EAAE,wBAAwB,GAAG,wBAAwB,CAAC;CAChF;AAED,wBAAgB,yBAAyB,CACxC,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,iBAAiB,EAC/B,IAAI,EAAE,aAAa,GACjB,IAAI,CAgNN"}
package/dist/lifecycle.js CHANGED
@@ -1,37 +1,74 @@
1
- import { compileMessages, getLatestUserMessage, } from "./compiler.js";
2
- import { PromptCompilationContext } from "./compiler.js";
1
+ import { getPiBasePrompt, projectPresetSystemPrompt } from "./capability-projection.js";
2
+ import { getLatestUserMessage, } from "./compiler.js";
3
+ import { PromptCompilationContext, dedupeDiagnostics } from "./compiler.js";
3
4
  import { applyFinalizeRegexRulesToMessage, applyRequestFrequencyRulesToMessages, hasRequestFrequencyRules } from "./regex.js";
4
5
  import { promptRuntimeFromPi } from "./prompt-runtime.js";
6
+ import { formatResourceKey } from "./resource-identity.js";
5
7
  import { resetCompileCycle } from "./compile-cycle.js";
6
8
  import { getCurrentBranchEntries, getLegacyVariableStateDiagnostic, getRestoredActiveId, getRestoredProfileProvenance } from "./session-adapter.js";
7
9
  export function registerLifecycleHandlers(pi, workspace, compileCycle, deps) {
8
10
  let startupToolPolicyPending = false;
11
+ let runFailed = false;
9
12
  pi.on("session_shutdown", async () => {
10
- // Pi carries the old runtime's active built-in tool names into a replacement
11
- // runtime. Restore the pre-policy set before reload/session replacement so the
12
- // replacement pi-forge instance can capture a complete baseline.
13
+ runFailed = false;
14
+ deps.setCapabilityAgentBusy?.(false);
15
+ // Publish a final cleared active-state snapshot before teardown so optional
16
+ // consumers do not retain appearance context from the retiring session.
17
+ // Active-state is optional, so a throwing transport/listener must never
18
+ // block tool-policy restoration or workspace teardown.
19
+ disposeActiveStateSafely(deps);
13
20
  startupToolPolicyPending = false;
14
- deps.restoreActiveToolPolicy();
15
- // Tear down the host first so a throwing subagent disposal cannot leak a
16
- // live host that keeps advertising the stale snapshot.
17
- deps.disposeForgeWorkspace();
18
- deps.disposePromptStackRuntime();
21
+ // Every teardown step runs even if a preceding one throws (for example
22
+ // when an optional bus transport rejects emit/unsubscribe). The first
23
+ // failure is rethrown only after all cleanup has been attempted.
24
+ let firstError;
25
+ for (const step of [
26
+ // A shared editor may outlive this runtime; stale hosts must stop accepting controls.
27
+ () => deps.disposeCapabilities?.(),
28
+ // Pi carries the old runtime's active built-in tool names into a
29
+ // replacement runtime. Restore the pre-policy set before reload/session
30
+ // replacement so the replacement can capture a complete baseline.
31
+ () => deps.restoreActiveToolPolicy(),
32
+ // Tear down the host first so a throwing subagent disposal cannot leak
33
+ // a live host that keeps advertising the stale snapshot.
34
+ () => deps.disposeForgeWorkspace(),
35
+ () => deps.disposePromptStackRuntime(),
36
+ ]) {
37
+ try {
38
+ step();
39
+ }
40
+ catch (error) {
41
+ firstError ??= error;
42
+ }
43
+ }
44
+ if (firstError !== undefined)
45
+ throw firstError;
19
46
  });
20
47
  pi.on("session_start", async (event, ctx) => {
48
+ runFailed = false;
49
+ deps.setCapabilityAgentBusy?.(false);
21
50
  startupToolPolicyPending = true;
51
+ // Suspend before any workspace reload so intermediate snapshots cannot be
52
+ // published under the still-bound old session id.
53
+ deps.suspendActiveState();
22
54
  try {
23
55
  const freshSession = shouldAutoActivateForSessionStart(event, ctx);
24
56
  await restoreBranchScopedRuntime(ctx, workspace, compileCycle, deps, { deferToolPolicy: true, suppressAutoActivate: freshSession });
25
57
  if (freshSession)
26
58
  await deps.activateFreshSessionDefaults(ctx);
59
+ deps.reloadForgeWorkspace(ctx);
60
+ deps.refreshWebEditorHost(ctx);
61
+ deps.notifyActivePreset(ctx, "after session " + event.reason);
62
+ // Resume and bind only once the restored workspace is complete.
63
+ deps.bindActiveState(ctx);
27
64
  }
28
65
  catch (error) {
29
66
  startupToolPolicyPending = false;
67
+ // A failed restore leaves the old binding stale; detach/clear instead
68
+ // of publishing it under a foreign workspace.
69
+ disposeActiveStateSafely(deps);
30
70
  throw error;
31
71
  }
32
- deps.reloadForgeWorkspace(ctx);
33
- deps.refreshWebEditorHost(ctx);
34
- deps.notifyActivePreset(ctx, "after session " + event.reason);
35
72
  });
36
73
  pi.on("resources_discover", async (_event, ctx) => {
37
74
  if (!startupToolPolicyPending)
@@ -40,73 +77,115 @@ export function registerLifecycleHandlers(pi, workspace, compileCycle, deps) {
40
77
  deps.syncActiveToolPolicy(ctx);
41
78
  });
42
79
  pi.on("session_tree", async (_event, ctx) => {
43
- await restoreBranchScopedRuntime(ctx, workspace, compileCycle, deps);
44
- deps.reloadForgeWorkspace(ctx);
45
- deps.refreshWebEditorHost(ctx);
46
- deps.notifyActivePreset(ctx, "after tree navigation");
80
+ runFailed = false;
81
+ deps.setCapabilityAgentBusy?.(false);
82
+ deps.suspendActiveState();
83
+ try {
84
+ await restoreBranchScopedRuntime(ctx, workspace, compileCycle, deps);
85
+ deps.reloadForgeWorkspace(ctx);
86
+ deps.refreshWebEditorHost(ctx);
87
+ deps.notifyActivePreset(ctx, "after tree navigation");
88
+ deps.bindActiveState(ctx);
89
+ }
90
+ catch (error) {
91
+ disposeActiveStateSafely(deps);
92
+ throw error;
93
+ }
47
94
  });
48
95
  pi.on("session_compact", async (_event, ctx) => {
49
- await restoreBranchScopedRuntime(ctx, workspace, compileCycle, deps);
50
- deps.reloadForgeWorkspace(ctx);
51
- deps.refreshWebEditorHost(ctx);
52
- deps.notifyActivePreset(ctx, "after compaction");
96
+ runFailed = false;
97
+ deps.setCapabilityAgentBusy?.(false);
98
+ deps.suspendActiveState();
99
+ try {
100
+ await restoreBranchScopedRuntime(ctx, workspace, compileCycle, deps);
101
+ deps.reloadForgeWorkspace(ctx);
102
+ deps.refreshWebEditorHost(ctx);
103
+ deps.notifyActivePreset(ctx, "after compaction");
104
+ // Same session: bindSession keeps the live instance and revision
105
+ // epoch, so compaction does not clear/recreate cosmetic state.
106
+ deps.bindActiveState(ctx);
107
+ }
108
+ catch (error) {
109
+ disposeActiveStateSafely(deps);
110
+ throw error;
111
+ }
53
112
  });
54
- pi.on("turn_start", async () => {
55
- deps.syncActiveToolPolicy();
113
+ pi.on("turn_start", async (_event, ctx) => {
114
+ deps.syncActiveToolPolicy(ctx);
56
115
  deps.persistActiveSelection();
57
116
  });
58
- pi.on("input", async () => {
59
- deps.syncActiveToolPolicy();
117
+ pi.on("input", async (_event, ctx) => {
118
+ deps.syncActiveToolPolicy(ctx);
60
119
  });
61
120
  pi.on("tool_call", async (event) => {
62
121
  const reason = deps.toolPolicyBlockReason(event.toolName);
63
122
  return reason ? { block: true, reason } : undefined;
64
123
  });
65
124
  pi.on("before_agent_start", async (event, ctx) => {
125
+ runFailed = false;
126
+ deps.setCapabilityAgentBusy?.(true);
66
127
  compileCycle.currentSystemPromptOptions = event.systemPromptOptions;
67
128
  deps.refreshWebEditorHost(ctx, event.systemPromptOptions);
68
129
  compileCycle.currentLatestUserMessage = event.prompt;
69
130
  compileCycle.contextRewritePending = true;
70
- const active = workspace.snapshotKnown ? workspace.snapshot().active : undefined;
71
- if (!active)
72
- return;
73
- const compilationRuntime = promptRuntimeFromPi(event.systemPromptOptions, ctx, event.prompt);
74
- compileCycle.currentCompilationContext = new PromptCompilationContext(active.stack, compilationRuntime);
75
- const result = compileCycle.currentCompilationContext.compileSystemPrompt(event.systemPrompt);
76
- deps.recordCompileDiagnostics(ctx, result.diagnostics);
77
- return { systemPrompt: result.systemPrompt };
131
+ compileCycle.currentBaseSystemPrompt = event.systemPrompt;
132
+ compileCycle.currentCompiledSystemPrompt = undefined;
133
+ compileCycle.currentCompiledStackKey = undefined;
134
+ compileCycle.currentPromptInputKey = undefined;
135
+ compileCycle.currentCompilationContext = undefined;
136
+ compileCycle.currentCompilationRuntime = promptRuntimeFromPi(event.systemPromptOptions, ctx, event.prompt);
137
+ // Never return a forced full systemPrompt: Pi reapplies it AFTER context hooks,
138
+ // which would silently suppress native instruction sections on tool follow-ups.
78
139
  });
79
- pi.on("context", async (event, ctx) => {
80
- const active = workspace.snapshotKnown ? workspace.snapshot().active : undefined;
81
- if (!active || !compileCycle.currentSystemPromptOptions)
82
- return;
83
- if (!compileCycle.contextRewritePending) {
84
- // Tool-result follow-up requests receive Pi's natural context. Outgoing
85
- // rules that opt into every-request application (frequency: "request")
86
- // still run over the full natural context — this is the only regex
87
- // pipeline entry on follow-ups, and it is wire-consistent because each
88
- // request is rebuilt from the transcript rather than from the first
89
- // request's rewritten output.
90
- if (!hasRequestFrequencyRules(active.stack))
91
- return;
92
- const diagnostics = [];
93
- const messages = applyRequestFrequencyRulesToMessages(active.stack, event.messages, diagnostics);
94
- if (diagnostics.length > 0)
95
- deps.recordCompileDiagnostics(ctx, diagnostics);
140
+ // Pi 0.87 ordinary context hooks intentionally exclude System messages.
141
+ // Keep the complete Forge pipeline together at the full-transcript boundary.
142
+ pi.on("context_with_system", async (event, ctx) => {
143
+ try {
144
+ deps.syncActiveToolPolicy(ctx);
145
+ let messages = event.messages;
146
+ messages = deps.prepareCapabilityMessages?.(messages, ctx) ?? messages;
147
+ const active = workspace.snapshotKnown ? workspace.snapshot().active : undefined;
148
+ if (active && compileCycle.currentSystemPromptOptions) {
149
+ const options = deps.toolPromptOptions?.(compileCycle.currentSystemPromptOptions) ?? compileCycle.currentSystemPromptOptions;
150
+ const runtime = promptRuntimeFromPi(options, ctx, compileCycle.currentLatestUserMessage, compileCycle.currentCompilationRuntime?.now);
151
+ const basePrompt = getPiBasePrompt(event.messages, compileCycle.currentBaseSystemPrompt ?? "");
152
+ const key = JSON.stringify([active.stack, runtime.options, runtime.model, basePrompt]);
153
+ if (!compileCycle.currentCompilationContext || compileCycle.currentPromptInputKey !== key) {
154
+ compileCycle.currentCompilationRuntime = runtime;
155
+ compileCycle.currentCompilationContext = new PromptCompilationContext(active.stack, runtime);
156
+ const result = compileCycle.currentCompilationContext.compileSystemPrompt(basePrompt);
157
+ compileCycle.currentBaseSystemPrompt = basePrompt;
158
+ compileCycle.currentCompiledSystemPrompt = result.systemPrompt;
159
+ compileCycle.currentCompiledStackKey = formatResourceKey(active.key);
160
+ compileCycle.currentPromptInputKey = key;
161
+ deps.recordCompileDiagnostics(ctx, result.diagnostics);
162
+ }
163
+ if (compileCycle.contextRewritePending) {
164
+ compileCycle.contextRewritePending = false;
165
+ const latest = getLatestUserMessage(messages) ?? compileCycle.currentLatestUserMessage;
166
+ compileCycle.currentCompilationContext.setLatestUserMessage(latest ?? "");
167
+ const result = compileCycle.currentCompilationContext.compileMessages(messages);
168
+ messages = result.messages;
169
+ deps.recordCompileDiagnostics(ctx, dedupeDiagnostics([compileCycle.latestCompileDiagnostics, result.diagnostics]));
170
+ }
171
+ else if (hasRequestFrequencyRules(active.stack)) {
172
+ const diagnostics = [];
173
+ messages = applyRequestFrequencyRulesToMessages(active.stack, messages, diagnostics);
174
+ if (diagnostics.length)
175
+ deps.recordCompileDiagnostics(ctx, diagnostics);
176
+ }
177
+ messages = projectPresetSystemPrompt(messages, compileCycle.currentCompiledSystemPrompt ?? "");
178
+ }
179
+ messages = deps.projectCapabilities?.(messages, ctx) ?? messages;
96
180
  return messages === event.messages ? undefined : { messages };
97
181
  }
98
- // Rewrite the message layout only for the first provider request of a user-submitted prompt.
99
- // Tool-result follow-up turns must receive Pi's natural context; otherwise post-history
100
- // prompt blocks such as COT / {{lastUserMessage}} are re-appended after every tool call
101
- // and the model restarts its planning instead of continuing from the tool result.
102
- compileCycle.contextRewritePending = false;
103
- const latestUserMessage = getLatestUserMessage(event.messages) ?? compileCycle.currentLatestUserMessage;
104
- compileCycle.currentCompilationContext?.setLatestUserMessage(latestUserMessage ?? "");
105
- const result = compileCycle.currentCompilationContext
106
- ? compileCycle.currentCompilationContext.compileMessages(event.messages)
107
- : compileMessages(active.stack, promptRuntimeFromPi(compileCycle.currentSystemPromptOptions, ctx, latestUserMessage), event.messages);
108
- deps.recordCompileDiagnostics(ctx, [...compileCycle.latestCompileDiagnostics, ...result.diagnostics]);
109
- return { messages: result.messages };
182
+ catch (error) {
183
+ // Pi logs hook exceptions and may otherwise dispatch the unmodified context.
184
+ // Abort explicitly so malformed state never yields text/tool half-application.
185
+ runFailed = true;
186
+ ctx.abort();
187
+ throw error;
188
+ }
110
189
  });
111
190
  pi.on("message_end", async (event, ctx) => {
112
191
  if (event.message.role === "assistant")
@@ -117,23 +196,53 @@ export function registerLifecycleHandlers(pi, workspace, compileCycle, deps) {
117
196
  const diagnostics = [];
118
197
  const message = applyFinalizeRegexRulesToMessage(active.stack, event.message, diagnostics);
119
198
  if (diagnostics.length > 0)
120
- deps.recordCompileDiagnostics(ctx, [...compileCycle.latestCompileDiagnostics, ...diagnostics]);
199
+ deps.recordCompileDiagnostics(ctx, dedupeDiagnostics([compileCycle.latestCompileDiagnostics, diagnostics]));
121
200
  if (!message)
122
201
  return;
123
202
  return { message };
124
203
  });
125
- pi.on("agent_end", async () => {
126
- resetCompileCycle(compileCycle);
204
+ pi.on("agent_end", async (_event, ctx) => {
205
+ // This is a safe low-level boundary, not the end of Pi's outer run.
206
+ // agent_before_settle may still request a continuation without another
207
+ // before_agent_start. Keep the compiled preset inputs until final settlement.
208
+ if (!runFailed && ctx)
209
+ deps.commitEndCapabilityAnchors?.(ctx);
127
210
  });
211
+ pi.on("agent_settled", async (_event, ctx) => {
212
+ try {
213
+ deps.setCapabilityAgentBusy?.(false);
214
+ if (!runFailed && ctx)
215
+ deps.commitEndCapabilityAnchors?.(ctx);
216
+ }
217
+ finally {
218
+ resetCompileCycle(compileCycle);
219
+ }
220
+ });
221
+ }
222
+ function disposeActiveStateSafely(deps) {
223
+ try {
224
+ deps.disposeActiveState();
225
+ }
226
+ catch {
227
+ // Optional active-state observers must never block lifecycle cleanup.
228
+ }
128
229
  }
129
230
  async function restoreBranchScopedRuntime(ctx, workspace, compileCycle, deps, options) {
231
+ deps.setCapabilityAgentBusy?.(false);
232
+ deps.prepareCapabilityRestore?.(ctx);
130
233
  const restoredProfile = getRestoredProfileProvenance(ctx);
131
234
  compileCycle.currentCompilationContext = undefined;
235
+ compileCycle.currentCompilationRuntime = undefined;
236
+ compileCycle.currentBaseSystemPrompt = undefined;
237
+ compileCycle.currentCompiledSystemPrompt = undefined;
238
+ compileCycle.currentCompiledStackKey = undefined;
239
+ compileCycle.currentPromptInputKey = undefined;
132
240
  compileCycle.latestCompileDiagnostics = getLegacyVariableStateDiagnostic(ctx);
133
241
  const restoredActiveId = getRestoredActiveId(ctx);
134
242
  deps.restorePersistedActiveId(restoredActiveId);
135
- await deps.reloadStacks(ctx, restoredActiveId, options);
243
+ await deps.reloadStacks(ctx, restoredActiveId, { ...options, deferToolPolicy: true });
136
244
  workspace.setLastAppliedProfile(restoredProfile);
245
+ deps.restoreCapabilities?.(ctx, options);
137
246
  }
138
247
  function shouldAutoActivateForSessionStart(event, ctx) {
139
248
  if (event.reason === "new")