@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.
- package/CHANGELOG.md +84 -0
- package/README.md +67 -103
- package/README.zh-CN.md +67 -95
- package/assets/pi-forge-header-concept-1.png +0 -0
- package/assets/readme/PROVENANCE.md +95 -0
- package/assets/readme/en/capability-tools.gif +0 -0
- package/assets/readme/en/context-composition.gif +0 -0
- package/assets/readme/en/context-toggle.gif +0 -0
- package/assets/readme/en/draft-diff.png +0 -0
- package/assets/readme/en/edit-draft-diff.gif +0 -0
- package/assets/readme/en/editor-overview-v3.png +0 -0
- package/assets/readme/en/editor-overview.png +0 -0
- package/assets/readme/en/mode-tools.gif +0 -0
- package/assets/readme/en/regex-transforms.gif +0 -0
- package/assets/readme/en/tool-selection.gif +0 -0
- package/assets/readme/tui-quickstart.gif +0 -0
- package/assets/readme/zh-CN/capability-tools.gif +0 -0
- package/assets/readme/zh-CN/context-composition.gif +0 -0
- package/assets/readme/zh-CN/context-toggle.gif +0 -0
- package/assets/readme/zh-CN/draft-diff.png +0 -0
- package/assets/readme/zh-CN/edit-draft-diff.gif +0 -0
- package/assets/readme/zh-CN/editor-overview-v3.png +0 -0
- package/assets/readme/zh-CN/editor-overview.png +0 -0
- package/assets/readme/zh-CN/mode-tools.gif +0 -0
- package/assets/readme/zh-CN/regex-transforms.gif +0 -0
- package/assets/readme/zh-CN/tool-selection.gif +0 -0
- package/dist/active-state.d.ts +148 -0
- package/dist/active-state.d.ts.map +1 -0
- package/dist/active-state.js +374 -0
- package/dist/active-state.js.map +1 -0
- package/dist/agent-profile.d.ts.map +1 -1
- package/dist/agent-profile.js +11 -0
- package/dist/agent-profile.js.map +1 -1
- package/dist/capabilities.d.ts +39 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +160 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/capability-anchors.d.ts +45 -0
- package/dist/capability-anchors.d.ts.map +1 -0
- package/dist/capability-anchors.js +263 -0
- package/dist/capability-anchors.js.map +1 -0
- package/dist/capability-command.d.ts +4 -0
- package/dist/capability-command.d.ts.map +1 -0
- package/dist/capability-command.js +164 -0
- package/dist/capability-command.js.map +1 -0
- package/dist/capability-events.d.ts +79 -0
- package/dist/capability-events.d.ts.map +1 -0
- package/dist/capability-events.js +478 -0
- package/dist/capability-events.js.map +1 -0
- package/dist/capability-projection.d.ts +22 -0
- package/dist/capability-projection.d.ts.map +1 -0
- package/dist/capability-projection.js +273 -0
- package/dist/capability-projection.js.map +1 -0
- package/dist/capability-protocol.d.ts +21 -0
- package/dist/capability-protocol.d.ts.map +1 -0
- package/dist/capability-protocol.js +15 -0
- package/dist/capability-protocol.js.map +1 -0
- package/dist/capability-state.d.ts +74 -0
- package/dist/capability-state.d.ts.map +1 -0
- package/dist/capability-state.js +43 -0
- package/dist/capability-state.js.map +1 -0
- package/dist/capability-tool.d.ts +11 -0
- package/dist/capability-tool.d.ts.map +1 -0
- package/dist/capability-tool.js +25 -0
- package/dist/capability-tool.js.map +1 -0
- package/dist/capability-web-host.d.ts +11 -0
- package/dist/capability-web-host.d.ts.map +1 -0
- package/dist/capability-web-host.js +105 -0
- package/dist/capability-web-host.js.map +1 -0
- package/dist/codecs/capability.d.ts +71 -0
- package/dist/codecs/capability.d.ts.map +1 -0
- package/dist/codecs/capability.js +363 -0
- package/dist/codecs/capability.js.map +1 -0
- package/dist/codecs/prompt-stack.d.ts +1 -1
- package/dist/codecs/prompt-stack.d.ts.map +1 -1
- package/dist/codecs/prompt-stack.js +140 -13
- package/dist/codecs/prompt-stack.js.map +1 -1
- package/dist/command-contribution/index.d.ts +21 -0
- package/dist/command-contribution/index.d.ts.map +1 -0
- package/dist/command-contribution/index.js +14 -0
- package/dist/command-contribution/index.js.map +1 -0
- package/dist/compile-cycle.d.ts +7 -1
- package/dist/compile-cycle.d.ts.map +1 -1
- package/dist/compile-cycle.js +2 -0
- package/dist/compile-cycle.js.map +1 -1
- package/dist/compiler.d.ts +7 -1
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +140 -19
- package/dist/compiler.js.map +1 -1
- package/dist/context-diff-history.d.ts +2 -0
- package/dist/context-diff-history.d.ts.map +1 -1
- package/dist/context-diff-history.js +9 -0
- package/dist/context-diff-history.js.map +1 -1
- package/dist/forge-command.d.ts +10 -0
- package/dist/forge-command.d.ts.map +1 -0
- package/dist/forge-command.js +106 -0
- package/dist/forge-command.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -7
- package/dist/index.js.map +1 -1
- package/dist/json-fingerprint.d.ts +11 -0
- package/dist/json-fingerprint.d.ts.map +1 -0
- package/dist/json-fingerprint.js +66 -0
- package/dist/json-fingerprint.js.map +1 -0
- package/dist/lifecycle.d.ts +14 -0
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +175 -66
- package/dist/lifecycle.js.map +1 -1
- package/dist/payload-command.d.ts +2 -2
- package/dist/payload-command.d.ts.map +1 -1
- package/dist/payload-command.js +80 -26
- package/dist/payload-command.js.map +1 -1
- package/dist/payload-state.d.ts +1 -0
- package/dist/payload-state.d.ts.map +1 -1
- package/dist/payload-state.js +1 -0
- package/dist/payload-state.js.map +1 -1
- package/dist/policy.d.ts +2 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +3 -0
- package/dist/policy.js.map +1 -1
- package/dist/preset-command.d.ts +2 -0
- package/dist/preset-command.d.ts.map +1 -1
- package/dist/preset-command.js +101 -36
- package/dist/preset-command.js.map +1 -1
- package/dist/preview-text.d.ts +5 -0
- package/dist/preview-text.d.ts.map +1 -0
- package/dist/preview-text.js +27 -0
- package/dist/preview-text.js.map +1 -0
- package/dist/preview.d.ts +18 -1
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +134 -99
- package/dist/preview.js.map +1 -1
- package/dist/profile-command.d.ts +4 -1
- package/dist/profile-command.d.ts.map +1 -1
- package/dist/profile-command.js +77 -14
- package/dist/profile-command.js.map +1 -1
- package/dist/prompt-cache-warning.d.ts +23 -0
- package/dist/prompt-cache-warning.d.ts.map +1 -0
- package/dist/prompt-cache-warning.js +74 -0
- package/dist/prompt-cache-warning.js.map +1 -0
- package/dist/regex.d.ts.map +1 -1
- package/dist/regex.js +5 -0
- package/dist/regex.js.map +1 -1
- package/dist/render-helpers.d.ts.map +1 -1
- package/dist/render-helpers.js +2 -0
- package/dist/render-helpers.js.map +1 -1
- package/dist/repositories/capability.d.ts +53 -0
- package/dist/repositories/capability.d.ts.map +1 -0
- package/dist/repositories/capability.js +294 -0
- package/dist/repositories/capability.js.map +1 -0
- package/dist/runtime/capability-runtime.d.ts +91 -0
- package/dist/runtime/capability-runtime.d.ts.map +1 -0
- package/dist/runtime/capability-runtime.js +967 -0
- package/dist/runtime/capability-runtime.js.map +1 -0
- package/dist/runtime/tool-policy-runtime.d.ts +8 -0
- package/dist/runtime/tool-policy-runtime.d.ts.map +1 -1
- package/dist/runtime/tool-policy-runtime.js +171 -30
- package/dist/runtime/tool-policy-runtime.js.map +1 -1
- package/dist/session-adapter.d.ts +13 -0
- package/dist/session-adapter.d.ts.map +1 -1
- package/dist/session-adapter.js +110 -0
- package/dist/session-adapter.js.map +1 -1
- package/dist/session-usage.d.ts +65 -0
- package/dist/session-usage.d.ts.map +1 -0
- package/dist/session-usage.js +134 -0
- package/dist/session-usage.js.map +1 -0
- package/dist/subagent/fingerprints.d.ts +3 -15
- package/dist/subagent/fingerprints.d.ts.map +1 -1
- package/dist/subagent/fingerprints.js +5 -69
- package/dist/subagent/fingerprints.js.map +1 -1
- package/dist/subagent/index.d.ts +2 -0
- package/dist/subagent/index.d.ts.map +1 -1
- package/dist/subagent/index.js +2 -0
- package/dist/subagent/index.js.map +1 -1
- package/dist/subagent-host.d.ts +2 -2
- package/dist/subagent-host.d.ts.map +1 -1
- package/dist/subagent-host.js +13 -1
- package/dist/subagent-host.js.map +1 -1
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/web-editor/client-script.generated.d.ts.map +1 -1
- package/dist/web-editor/client-script.generated.js +1 -1
- package/dist/web-editor/client-script.generated.js.map +1 -1
- package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
- package/dist/web-editor/client-styles.generated.js +1 -1
- package/dist/web-editor/client-styles.generated.js.map +1 -1
- package/dist/web-editor/server.d.ts.map +1 -1
- package/dist/web-editor/server.js +152 -4
- package/dist/web-editor/server.js.map +1 -1
- package/dist/web-editor/styles.d.ts.map +1 -1
- package/dist/web-editor/styles.js +521 -116
- package/dist/web-editor/styles.js.map +1 -1
- package/dist/web-editor/types.d.ts +81 -1
- package/dist/web-editor/types.d.ts.map +1 -1
- package/dist/web-host.d.ts +7 -0
- package/dist/web-host.d.ts.map +1 -1
- package/dist/web-host.js +168 -5
- package/dist/web-host.js.map +1 -1
- package/dist/workspace.d.ts +11 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +63 -5
- package/dist/workspace.js.map +1 -1
- package/docs/README.md +4 -0
- package/docs/design/README.md +3 -1
- package/docs/design/architecture-0.5.md +22 -0
- package/docs/design/archive/2026-09-12-system-update-design.md +229 -0
- package/docs/design/pi-forge-system-update-design-notes.md +157 -0
- package/docs/development/release.md +20 -20
- package/docs/development/roadmap.md +17 -2
- package/docs/development/scoped-global-profiles-stacks.md +1 -1
- package/docs/development/setup.md +1 -1
- package/docs/getting-started.md +1 -1
- package/docs/guides/delegation.md +22 -20
- package/docs/guides/migrating-to-0.5.md +29 -0
- package/docs/guides/use-cases.md +6 -2
- package/docs/guides/web-editor.md +73 -5
- package/docs/reference/active-state.md +77 -0
- package/docs/reference/capabilities.md +259 -0
- package/docs/reference/commands.md +52 -24
- package/docs/reference/configuration.md +4 -2
- package/docs/reference/features.md +70 -4
- package/docs/reference/provider-support.md +67 -0
- package/docs/reference/public-api.md +49 -3
- package/docs/reference/session-cache.md +112 -0
- package/docs/reference/stack-schema.md +18 -4
- package/docs/reference/subagent-host-port.md +8 -0
- package/docs/zh-CN/README.md +3 -0
- package/docs/zh-CN/getting-started.md +1 -1
- package/docs/zh-CN/guides/delegation.md +22 -10
- package/docs/zh-CN/guides/migrating-to-0.5.md +29 -0
- package/docs/zh-CN/guides/web-editor.md +74 -7
- package/docs/zh-CN/reference/capabilities.md +259 -0
- package/docs/zh-CN/reference/commands.md +61 -33
- package/docs/zh-CN/reference/provider-support.md +67 -0
- package/docs/zh-CN/reference/session-cache.md +112 -0
- package/examples/capabilities/review.json +12 -0
- package/examples/capabilities/write-tools.json +15 -0
- package/examples/read-first-worker-prompt-stack.json +49 -0
- 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).
|
|
20
|
-
*
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|
package/dist/lifecycle.d.ts
CHANGED
|
@@ -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
|
package/dist/lifecycle.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
//
|
|
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
|
-
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
44
|
-
deps.
|
|
45
|
-
deps.
|
|
46
|
-
|
|
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
|
-
|
|
50
|
-
deps.
|
|
51
|
-
deps.
|
|
52
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
compileCycle.currentCompilationContext =
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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, [
|
|
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
|
-
|
|
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")
|