@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
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { getCurrentSystemPrompt, renderSystemMessageUpdate } from "@earendil-works/pi-ai";
|
|
2
|
+
import { isCapabilityDelivery, } from "./capability-protocol.js";
|
|
3
|
+
import { reduceCapabilityEvents, } from "./capability-events.js";
|
|
4
|
+
const BUILTIN_BASE_KEYS = new Set([
|
|
5
|
+
"preamble",
|
|
6
|
+
"tools",
|
|
7
|
+
"rules",
|
|
8
|
+
"docs",
|
|
9
|
+
"addendum",
|
|
10
|
+
"project_context",
|
|
11
|
+
"skills",
|
|
12
|
+
"cwd",
|
|
13
|
+
]);
|
|
14
|
+
/** Rebuild only Pi's owned base; foreign named sections/prose remain separate. */
|
|
15
|
+
export function getPiBasePrompt(messages, fallback) {
|
|
16
|
+
const systems = messages.filter((message) => message.role === "system");
|
|
17
|
+
if (!systems.length)
|
|
18
|
+
return fallback;
|
|
19
|
+
return getCurrentSystemPrompt(systems.map((message, index) => ({
|
|
20
|
+
role: "system",
|
|
21
|
+
content: index === 0 ? message.content : "",
|
|
22
|
+
sections: Object.fromEntries(Object.entries(message.sections ?? {}).filter(([key]) => BUILTIN_BASE_KEYS.has(key))),
|
|
23
|
+
timestamp: message.timestamp,
|
|
24
|
+
})));
|
|
25
|
+
}
|
|
26
|
+
function createProjectedMessage(sections, timestamp, native) {
|
|
27
|
+
if (native) {
|
|
28
|
+
return {
|
|
29
|
+
role: "system",
|
|
30
|
+
content: "",
|
|
31
|
+
sections,
|
|
32
|
+
timestamp,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const updateText = renderSystemMessageUpdate({
|
|
36
|
+
role: "system",
|
|
37
|
+
content: "",
|
|
38
|
+
sections,
|
|
39
|
+
timestamp,
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
role: "user",
|
|
43
|
+
content: `[pi-forge capability update]\n${updateText}`,
|
|
44
|
+
timestamp,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function computeDeltaSections(prev, curr) {
|
|
48
|
+
const sections = {};
|
|
49
|
+
let hasChanges = false;
|
|
50
|
+
for (const [id, content] of curr) {
|
|
51
|
+
const prevContent = prev.get(id);
|
|
52
|
+
if (prevContent === undefined || prevContent !== content) {
|
|
53
|
+
sections[`forge-capability-${id}`] = content;
|
|
54
|
+
hasChanges = true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (const [id] of prev) {
|
|
58
|
+
if (!curr.has(id)) {
|
|
59
|
+
sections[`forge-capability-${id}`] = null;
|
|
60
|
+
hasChanges = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return hasChanges ? sections : null;
|
|
64
|
+
}
|
|
65
|
+
function capabilityActivationIds(sections) {
|
|
66
|
+
const prefix = "forge-capability-";
|
|
67
|
+
return Object.keys(sections)
|
|
68
|
+
.filter((key) => key.startsWith(prefix))
|
|
69
|
+
.map((key) => key.slice(prefix.length));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Pure capability projection bridge. Replaces delivery markers with native
|
|
73
|
+
* SystemMessage or fallback UserMessage updates based on event prefixes.
|
|
74
|
+
*/
|
|
75
|
+
export function projectCapabilityMessages(messages, history, native, onUpdate) {
|
|
76
|
+
if (!history || typeof history !== "object" || !Array.isArray(history.events)) {
|
|
77
|
+
throw new Error("Invalid capability history: events array is required");
|
|
78
|
+
}
|
|
79
|
+
const fullReduction = reduceCapabilityEvents(history.events);
|
|
80
|
+
if (!fullReduction.ok) {
|
|
81
|
+
throw new Error(`Invalid capability events at index ${fullReduction.index}: ${fullReduction.error}`);
|
|
82
|
+
}
|
|
83
|
+
// Identical event replays are semantic no-ops, not new cursor positions.
|
|
84
|
+
const seenEvents = new Set();
|
|
85
|
+
history = { ...history, events: history.events.filter((event) => {
|
|
86
|
+
if (seenEvents.has(event.eventId))
|
|
87
|
+
return false;
|
|
88
|
+
seenEvents.add(event.eventId);
|
|
89
|
+
return true;
|
|
90
|
+
}) };
|
|
91
|
+
let checkpointIndex = -1;
|
|
92
|
+
if (history.checkpointThrough !== undefined) {
|
|
93
|
+
if (typeof history.checkpointThrough !== "string" || history.checkpointThrough.length === 0) {
|
|
94
|
+
throw new Error("Invalid checkpointThrough: must be a non-empty string");
|
|
95
|
+
}
|
|
96
|
+
checkpointIndex = history.events.findIndex((e) => e.eventId === history.checkpointThrough);
|
|
97
|
+
if (checkpointIndex === -1) {
|
|
98
|
+
throw new Error(`checkpointThrough "${history.checkpointThrough}" not found in branch events`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const eventIndexMap = new Map();
|
|
102
|
+
for (let i = 0; i < history.events.length; i++) {
|
|
103
|
+
eventIndexMap.set(history.events[i].eventId, i);
|
|
104
|
+
}
|
|
105
|
+
for (const msg of messages) {
|
|
106
|
+
if (isCapabilityDelivery(msg)) {
|
|
107
|
+
const raw = msg;
|
|
108
|
+
if (!raw.details || typeof raw.details !== "object" || Array.isArray(raw.details)) {
|
|
109
|
+
throw new Error("Invalid capability delivery marker: details object is required");
|
|
110
|
+
}
|
|
111
|
+
const details = raw.details;
|
|
112
|
+
if (details.schemaVersion !== 1) {
|
|
113
|
+
throw new Error(`Invalid capability delivery marker: schemaVersion must be 1, got ${details.schemaVersion}`);
|
|
114
|
+
}
|
|
115
|
+
if (typeof details.throughEventId !== "string" || details.throughEventId.length === 0) {
|
|
116
|
+
throw new Error("Invalid capability delivery marker: throughEventId must be a non-empty string");
|
|
117
|
+
}
|
|
118
|
+
if (!eventIndexMap.has(details.throughEventId)) {
|
|
119
|
+
throw new Error(`Delivery marker cursor "${details.throughEventId}" not found in branch events`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const activeCache = new Map();
|
|
124
|
+
activeCache.set(-1, new Map());
|
|
125
|
+
function getActiveMap(eventIndex) {
|
|
126
|
+
const cached = activeCache.get(eventIndex);
|
|
127
|
+
if (cached)
|
|
128
|
+
return cached;
|
|
129
|
+
const subEvents = history.events.slice(0, eventIndex + 1);
|
|
130
|
+
const res = reduceCapabilityEvents(subEvents);
|
|
131
|
+
if (!res.ok) {
|
|
132
|
+
throw new Error(`Failed to reduce event prefix: ${res.error}`);
|
|
133
|
+
}
|
|
134
|
+
const map = new Map();
|
|
135
|
+
for (const item of res.active) {
|
|
136
|
+
// Tool-only capabilities carry no capability text: never project an empty
|
|
137
|
+
// section on activation, nor a removal notice when they stop.
|
|
138
|
+
if (item.snapshot.content.trim().length === 0)
|
|
139
|
+
continue;
|
|
140
|
+
map.set(item.snapshot.activationId, item.snapshot.content);
|
|
141
|
+
}
|
|
142
|
+
activeCache.set(eventIndex, map);
|
|
143
|
+
return map;
|
|
144
|
+
}
|
|
145
|
+
let currentCursor = -1;
|
|
146
|
+
let currentState = new Map();
|
|
147
|
+
let checkpointMessage = undefined;
|
|
148
|
+
if (history.checkpointThrough !== undefined) {
|
|
149
|
+
currentCursor = checkpointIndex;
|
|
150
|
+
currentState = getActiveMap(checkpointIndex);
|
|
151
|
+
if (currentState.size > 0) {
|
|
152
|
+
const checkpointSections = {};
|
|
153
|
+
for (const [id, content] of currentState) {
|
|
154
|
+
checkpointSections[`forge-capability-${id}`] = content;
|
|
155
|
+
}
|
|
156
|
+
const checkpointTimestamp = history.events[checkpointIndex].createdAt;
|
|
157
|
+
checkpointMessage = createProjectedMessage(checkpointSections, checkpointTimestamp, native);
|
|
158
|
+
onUpdate?.(checkpointMessage, {
|
|
159
|
+
activationIds: capabilityActivationIds(checkpointSections),
|
|
160
|
+
kind: "checkpoint",
|
|
161
|
+
throughEventId: history.events[checkpointIndex].eventId,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const out = [];
|
|
166
|
+
for (const msg of messages) {
|
|
167
|
+
if (!isCapabilityDelivery(msg)) {
|
|
168
|
+
out.push(msg);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const markerDetails = msg.details;
|
|
172
|
+
const markerCursor = eventIndexMap.get(markerDetails.throughEventId);
|
|
173
|
+
if (history.checkpointThrough !== undefined && markerCursor <= checkpointIndex) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (markerCursor < currentCursor) {
|
|
177
|
+
throw new Error(`Corrupt marker cursor: marker at "${markerDetails.throughEventId}" (index ${markerCursor}) is earlier than current cursor position ${currentCursor}`);
|
|
178
|
+
}
|
|
179
|
+
if (markerCursor === currentCursor) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const nextState = getActiveMap(markerCursor);
|
|
183
|
+
const delta = computeDeltaSections(currentState, nextState);
|
|
184
|
+
currentState = nextState;
|
|
185
|
+
currentCursor = markerCursor;
|
|
186
|
+
if (delta !== null) {
|
|
187
|
+
const timestamp = typeof msg.timestamp === "number" ? msg.timestamp : 0;
|
|
188
|
+
const projectedMessage = createProjectedMessage(delta, timestamp, native);
|
|
189
|
+
out.push(projectedMessage);
|
|
190
|
+
onUpdate?.(projectedMessage, {
|
|
191
|
+
activationIds: capabilityActivationIds(delta),
|
|
192
|
+
kind: "anchor",
|
|
193
|
+
throughEventId: markerDetails.throughEventId,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (checkpointMessage !== undefined) {
|
|
198
|
+
const insertIdx = out.findIndex((m) => m.role === "system");
|
|
199
|
+
if (insertIdx !== -1) {
|
|
200
|
+
out.splice(insertIdx + 1, 0, checkpointMessage);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
out.unshift(checkpointMessage);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Missing carriers may be queued until agent_end, or lost at a crash boundary.
|
|
207
|
+
// Replay EACH pending event: a rule rendered on the previous request still
|
|
208
|
+
// needs an instance-specific stop notice, even if the final net state is empty.
|
|
209
|
+
for (let index = currentCursor + 1; index < history.events.length; index++) {
|
|
210
|
+
const nextState = getActiveMap(index);
|
|
211
|
+
const delta = computeDeltaSections(currentState, nextState);
|
|
212
|
+
currentState = nextState;
|
|
213
|
+
if (delta !== null) {
|
|
214
|
+
const projectedMessage = createProjectedMessage(delta, history.events[index].createdAt, native);
|
|
215
|
+
out.push(projectedMessage);
|
|
216
|
+
onUpdate?.(projectedMessage, {
|
|
217
|
+
activationIds: capabilityActivationIds(delta),
|
|
218
|
+
kind: "pending",
|
|
219
|
+
throughEventId: history.events[index].eventId,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const throughEventId = history.events.length > 0
|
|
224
|
+
? history.events[history.events.length - 1].eventId
|
|
225
|
+
: undefined;
|
|
226
|
+
return {
|
|
227
|
+
messages: out,
|
|
228
|
+
...(throughEventId !== undefined ? { throughEventId } : {}),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Projects a preset-compiled system prompt into messages. Strips Pi builtin base
|
|
233
|
+
* sections, sets the leading System content, preserves foreign sections and tools.
|
|
234
|
+
*/
|
|
235
|
+
export function projectPresetSystemPrompt(messages, compiled) {
|
|
236
|
+
let headDone = false;
|
|
237
|
+
const out = [];
|
|
238
|
+
for (const m of messages) {
|
|
239
|
+
if (m.role !== "system") {
|
|
240
|
+
out.push(m);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const sysMsg = m;
|
|
244
|
+
let filteredSections = undefined;
|
|
245
|
+
if (sysMsg.sections) {
|
|
246
|
+
const remainingEntries = Object.entries(sysMsg.sections).filter(([k]) => !BUILTIN_BASE_KEYS.has(k));
|
|
247
|
+
if (remainingEntries.length > 0) {
|
|
248
|
+
filteredSections = Object.fromEntries(remainingEntries);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const newMsg = {
|
|
252
|
+
...sysMsg,
|
|
253
|
+
content: headDone ? sysMsg.content : compiled,
|
|
254
|
+
};
|
|
255
|
+
if (filteredSections !== undefined) {
|
|
256
|
+
newMsg.sections = filteredSections;
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
delete newMsg.sections;
|
|
260
|
+
}
|
|
261
|
+
headDone = true;
|
|
262
|
+
out.push(newMsg);
|
|
263
|
+
}
|
|
264
|
+
if (!headDone) {
|
|
265
|
+
out.unshift({
|
|
266
|
+
role: "system",
|
|
267
|
+
content: compiled,
|
|
268
|
+
timestamp: 0,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return out;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=capability-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-projection.js","sourceRoot":"","sources":["../src/capability-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CapabilityEvent } from "./capability-events.ts";
|
|
2
|
+
export declare const CAPABILITY_EVENT_ENTRY = "pi-forge-capability-event";
|
|
3
|
+
export declare const CAPABILITY_TOOLS_ENTRY = "pi-forge-capability-tools";
|
|
4
|
+
export declare const CAPABILITY_DELIVERY_TYPE = "pi-forge-capability-delivery";
|
|
5
|
+
/** Events are authoritative. A delivery marker contains only a branch-local cursor. */
|
|
6
|
+
export interface CapabilityHistory {
|
|
7
|
+
events: readonly CapabilityEvent[];
|
|
8
|
+
/** Last semantic event at/before the latest Pi compaction, if any. */
|
|
9
|
+
checkpointThrough?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Persisted plain custom entry metadata for a capability anchor.
|
|
13
|
+
*/
|
|
14
|
+
export interface CapabilityAnchorData {
|
|
15
|
+
readonly schemaVersion: 1;
|
|
16
|
+
readonly throughEventId: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function isCapabilityDelivery(message: unknown): boolean;
|
|
19
|
+
/** Structural history is not ordinary dialogue for role, regex or budget filters. */
|
|
20
|
+
export declare function isCapabilityControlMessage(message: unknown): boolean;
|
|
21
|
+
//# sourceMappingURL=capability-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-protocol.d.ts","sourceRoot":"","sources":["../src/capability-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAClE,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAClE,eAAO,MAAM,wBAAwB,iCAAiC,CAAC;AAEvE,uFAAuF;AACvF,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI9D;AAED,qFAAqF;AACrF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAGpE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const CAPABILITY_EVENT_ENTRY = "pi-forge-capability-event";
|
|
2
|
+
export const CAPABILITY_TOOLS_ENTRY = "pi-forge-capability-tools";
|
|
3
|
+
export const CAPABILITY_DELIVERY_TYPE = "pi-forge-capability-delivery";
|
|
4
|
+
export function isCapabilityDelivery(message) {
|
|
5
|
+
if (!message || typeof message !== "object")
|
|
6
|
+
return false;
|
|
7
|
+
const value = message;
|
|
8
|
+
return value.role === "custom" && value.customType === CAPABILITY_DELIVERY_TYPE;
|
|
9
|
+
}
|
|
10
|
+
/** Structural history is not ordinary dialogue for role, regex or budget filters. */
|
|
11
|
+
export function isCapabilityControlMessage(message) {
|
|
12
|
+
return !!message && typeof message === "object"
|
|
13
|
+
&& (message.role === "system" || isCapabilityDelivery(message));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=capability-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-protocol.js","sourceRoot":"","sources":["../src/capability-protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,2BAA2B,CAAC;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG,2BAA2B,CAAC;AAClE,MAAM,CAAC,MAAM,wBAAwB,GAAG,8BAA8B,CAAC;AAiBvE,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACpD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,KAAK,GAAG,OAAmD,CAAC;IAClE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,wBAAwB,CAAC;AACjF,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IAC1D,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;WAC3C,CAAE,OAA8B,CAAC,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { CapabilityToolPatch } from "./codecs/capability.ts";
|
|
2
|
+
import type { SessionCacheUsageView } from "./session-usage.ts";
|
|
3
|
+
/** A derived session view, never a second persisted capability state. */
|
|
4
|
+
export interface CapabilityStateGuard {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
leafId: string | null;
|
|
7
|
+
revision: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CapabilityChoice {
|
|
10
|
+
kind: "capability" | "binding";
|
|
11
|
+
id: string;
|
|
12
|
+
label: string;
|
|
13
|
+
content: string;
|
|
14
|
+
tools: CapabilityToolPatch;
|
|
15
|
+
fingerprint: string;
|
|
16
|
+
problem?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface CapabilityStateView {
|
|
19
|
+
guard: CapabilityStateGuard;
|
|
20
|
+
/** Active loaded Preset fingerprint for inspection freshness, not a write receipt. */
|
|
21
|
+
presetRevision?: string;
|
|
22
|
+
trusted: boolean;
|
|
23
|
+
restoring: boolean;
|
|
24
|
+
delivery: "none" | "pending" | "prepared";
|
|
25
|
+
textPresentation: "native" | "user";
|
|
26
|
+
effectiveTools: string[];
|
|
27
|
+
/** Read-only provider-reported usage for the current branch; absent when unavailable. */
|
|
28
|
+
cacheUsage?: SessionCacheUsageView;
|
|
29
|
+
problem?: string;
|
|
30
|
+
active: Array<{
|
|
31
|
+
activationId: string;
|
|
32
|
+
source: string;
|
|
33
|
+
name?: string;
|
|
34
|
+
actor: "user" | "agent";
|
|
35
|
+
content: string;
|
|
36
|
+
tools: CapabilityToolPatch;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export type CapabilityStateMutation = {
|
|
40
|
+
action: "disable";
|
|
41
|
+
activationId: string;
|
|
42
|
+
guard: CapabilityStateGuard;
|
|
43
|
+
} | {
|
|
44
|
+
action: "reset";
|
|
45
|
+
guard: CapabilityStateGuard;
|
|
46
|
+
};
|
|
47
|
+
export interface CapabilityEnableRequest {
|
|
48
|
+
guard: CapabilityStateGuard;
|
|
49
|
+
kind: "capability" | "binding";
|
|
50
|
+
id: string;
|
|
51
|
+
fingerprint: string;
|
|
52
|
+
}
|
|
53
|
+
export type CapabilityAvailableResult = {
|
|
54
|
+
ok: true;
|
|
55
|
+
state: CapabilityStateView;
|
|
56
|
+
choices: CapabilityChoice[];
|
|
57
|
+
} | {
|
|
58
|
+
ok: false;
|
|
59
|
+
status: number;
|
|
60
|
+
error: string;
|
|
61
|
+
};
|
|
62
|
+
export type CapabilityStateResult = {
|
|
63
|
+
ok: true;
|
|
64
|
+
state: CapabilityStateView;
|
|
65
|
+
} | {
|
|
66
|
+
ok: false;
|
|
67
|
+
status: number;
|
|
68
|
+
error: string;
|
|
69
|
+
};
|
|
70
|
+
/** Exact input validation is shared by HTTP and direct application callers. */
|
|
71
|
+
export declare function isCapabilityStateMutation(value: unknown): value is CapabilityStateMutation;
|
|
72
|
+
/** Exact validation for the guarded, human-only activation operation. */
|
|
73
|
+
export declare function isCapabilityEnableRequest(value: unknown): value is CapabilityEnableRequest;
|
|
74
|
+
//# sourceMappingURL=capability-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-state.d.ts","sourceRoot":"","sources":["../src/capability-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,yEAAyE;AACzE,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IAC1C,gBAAgB,EAAE,QAAQ,GAAG,MAAM,CAAC;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,yFAAyF;IACzF,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,mBAAmB,CAAC;KAC3B,CAAC,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,GAChC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,GACxE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,yBAAyB,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,GACrE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,MAAM,MAAM,qBAAqB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GACxC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,+EAA+E;AAC/E,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,uBAAuB,CAW1F;AAED,yEAAyE;AACzE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,uBAAuB,CAM1F"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Exact input validation is shared by HTTP and direct application callers. */
|
|
2
|
+
export function isCapabilityStateMutation(value) {
|
|
3
|
+
if (!plain(value))
|
|
4
|
+
return false;
|
|
5
|
+
const keys = value.action === "disable" ? ["action", "activationId", "guard"] : ["action", "guard"];
|
|
6
|
+
if (value.action !== "disable" && value.action !== "reset")
|
|
7
|
+
return false;
|
|
8
|
+
if (Object.keys(value).some((key) => !keys.includes(key)))
|
|
9
|
+
return false;
|
|
10
|
+
if (value.action === "disable" && !text(value.activationId, 128))
|
|
11
|
+
return false;
|
|
12
|
+
const guard = value.guard;
|
|
13
|
+
return plain(guard) && Object.keys(guard).length === 3
|
|
14
|
+
&& Object.keys(guard).every((key) => ["sessionId", "leafId", "revision"].includes(key))
|
|
15
|
+
&& text(guard.sessionId, 1024) && (guard.leafId === null || text(guard.leafId, 1024))
|
|
16
|
+
&& text(guard.revision, 256);
|
|
17
|
+
}
|
|
18
|
+
/** Exact validation for the guarded, human-only activation operation. */
|
|
19
|
+
export function isCapabilityEnableRequest(value) {
|
|
20
|
+
if (!plain(value) || Object.keys(value).length !== 4)
|
|
21
|
+
return false;
|
|
22
|
+
if (Object.keys(value).some((key) => !["guard", "kind", "id", "fingerprint"].includes(key)))
|
|
23
|
+
return false;
|
|
24
|
+
if (value.kind !== "capability" && value.kind !== "binding")
|
|
25
|
+
return false;
|
|
26
|
+
if (!text(value.id, 128) || !text(value.fingerprint, 256))
|
|
27
|
+
return false;
|
|
28
|
+
return isGuard(value.guard);
|
|
29
|
+
}
|
|
30
|
+
function isGuard(value) {
|
|
31
|
+
return plain(value) && Object.keys(value).length === 3
|
|
32
|
+
&& Object.keys(value).every((key) => ["sessionId", "leafId", "revision"].includes(key))
|
|
33
|
+
&& text(value.sessionId, 1024) && (value.leafId === null || text(value.leafId, 1024))
|
|
34
|
+
&& text(value.revision, 256);
|
|
35
|
+
}
|
|
36
|
+
function text(value, max) {
|
|
37
|
+
return typeof value === "string" && value.length > 0 && value.length <= max && !/[\x00-\x1f\x7f]/.test(value);
|
|
38
|
+
}
|
|
39
|
+
function plain(value) {
|
|
40
|
+
return !!value && typeof value === "object" && !Array.isArray(value)
|
|
41
|
+
&& (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=capability-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-state.js","sourceRoot":"","sources":["../src/capability-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Type, type Static } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import type { CapabilityRuntime } from "./runtime/capability-runtime.ts";
|
|
4
|
+
export declare const FORGE_CAPABILITY_TOOL_NAME = "forge_capability";
|
|
5
|
+
export declare const ForgeCapabilityParameters: Type.TObject<{
|
|
6
|
+
action: Type.TUnion<[Type.TLiteral<"list">, Type.TLiteral<"status">, Type.TLiteral<"enable">, Type.TLiteral<"disable">]>;
|
|
7
|
+
id: Type.TOptional<Type.TString>;
|
|
8
|
+
}>;
|
|
9
|
+
export type ForgeCapabilityParams = Static<typeof ForgeCapabilityParameters>;
|
|
10
|
+
export declare function registerCapabilityTool(pi: ExtensionAPI, runtime: CapabilityRuntime): void;
|
|
11
|
+
//# sourceMappingURL=capability-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-tool.d.ts","sourceRoot":"","sources":["../src/capability-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D,eAAO,MAAM,yBAAyB;;;EAgBrC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE7E,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAYzF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Type } from "@earendil-works/pi-ai";
|
|
2
|
+
export const FORGE_CAPABILITY_TOOL_NAME = "forge_capability";
|
|
3
|
+
export const ForgeCapabilityParameters = Type.Object({
|
|
4
|
+
action: Type.Union([
|
|
5
|
+
Type.Literal("list"),
|
|
6
|
+
Type.Literal("status"),
|
|
7
|
+
Type.Literal("enable"),
|
|
8
|
+
Type.Literal("disable"),
|
|
9
|
+
], { description: "Capability action: list, status, enable, or disable." }),
|
|
10
|
+
id: Type.Optional(Type.String({ maxLength: 128, description: "Preset-bound capability binding ID to enable or disable." })),
|
|
11
|
+
}, { additionalProperties: false });
|
|
12
|
+
export function registerCapabilityTool(pi, runtime) {
|
|
13
|
+
pi.registerTool({
|
|
14
|
+
name: FORGE_CAPABILITY_TOOL_NAME,
|
|
15
|
+
label: "Capability",
|
|
16
|
+
description: "Use only capabilities authorized by the active Preset: list, status, enable by binding ID, or disable your own Agent-owned activation. Requires a trusted project and current authorization on every call. Cannot add arbitrary rules, reset, or stop human-owned capabilities.",
|
|
17
|
+
parameters: ForgeCapabilityParameters,
|
|
18
|
+
execute: async (toolCallId, params, signal, onUpdate, ctx) => {
|
|
19
|
+
if (!ctx)
|
|
20
|
+
throw new Error("forge_capability requires an active extension context.");
|
|
21
|
+
return await runtime.executeAgentTool(ctx, params);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=capability-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-tool.js","sourceRoot":"","sources":["../src/capability-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,uBAAuB,CAAC;AAI1D,MAAM,CAAC,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAE7D,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,MAAM,CACnD;IACC,MAAM,EAAE,IAAI,CAAC,KAAK,CACjB;QACC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;KACvB,EACD,EAAE,WAAW,EAAE,sDAAsD,EAAE,CACvE;IACD,EAAE,EAAE,IAAI,CAAC,QAAQ,CAChB,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,0DAA0D,EAAE,CAAC,CACxG;CACD,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAIF,MAAM,UAAU,sBAAsB,CAAC,EAAgB,EAAE,OAA0B;IAClF,EAAE,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,0BAA0B;QAChC,KAAK,EAAE,YAAY;QACnB,WAAW,EACV,iRAAiR;QAClR,UAAU,EAAE,yBAAyB;QACrC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE;YAC5D,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACpF,OAAO,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type LoadedCapability } from "./codecs/capability.ts";
|
|
3
|
+
import type { LoadedPromptStack } from "./types.ts";
|
|
4
|
+
import type { WebEditorCapabilityOperation, WebEditorCapabilityResult } from "./web-editor/types.ts";
|
|
5
|
+
export interface CapabilityWebResources {
|
|
6
|
+
readCapabilities?(): readonly LoadedCapability[];
|
|
7
|
+
getStacks(): LoadedPromptStack[];
|
|
8
|
+
}
|
|
9
|
+
/** Optional Web adapter; Workspace/repositories and the existing resolver retain ownership. */
|
|
10
|
+
export declare function capabilityOperation(ctx: ExtensionContext, runtime: CapabilityWebResources, action: WebEditorCapabilityOperation, selector?: string, input?: unknown): WebEditorCapabilityResult;
|
|
11
|
+
//# sourceMappingURL=capability-web-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-web-host.d.ts","sourceRoot":"","sources":["../src/capability-web-host.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAgE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAK7H,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAA4B,4BAA4B,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAE/H,MAAM,WAAW,sBAAsB;IACtC,gBAAgB,CAAC,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACjD,SAAS,IAAI,iBAAiB,EAAE,CAAC;CACjC;AAOD,+FAA+F;AAC/F,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,sBAAsB,EACzF,MAAM,EAAE,4BAA4B,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,yBAAyB,CA0EpG"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { serializeCapability } from "./codecs/capability.js";
|
|
4
|
+
import { createResourceCatalog } from "./catalog.js";
|
|
5
|
+
import { resolveCapability, resolveCapabilityBindings } from "./capabilities.js";
|
|
6
|
+
import { formatResourceKey, parseResourceSelector, isValidResourceId } from "./resource-identity.js";
|
|
7
|
+
import { deleteCapabilityFile, globalCapabilitiesDir, capabilitiesDir, writeCapabilityFile } from "./repositories/capability.js";
|
|
8
|
+
function objectWithKeys(input, keys) {
|
|
9
|
+
return !!input && typeof input === "object" && !Array.isArray(input)
|
|
10
|
+
&& Object.keys(input).every(key => keys.includes(key));
|
|
11
|
+
}
|
|
12
|
+
/** Optional Web adapter; Workspace/repositories and the existing resolver retain ownership. */
|
|
13
|
+
export function capabilityOperation(ctx, runtime, action, selector, input) {
|
|
14
|
+
try {
|
|
15
|
+
const trusted = ctx.isProjectTrusted();
|
|
16
|
+
if (!runtime.readCapabilities)
|
|
17
|
+
return { ok: false, status: 503, error: "Capability resources unavailable." };
|
|
18
|
+
if (["create", "save", "delete"].includes(action) && !trusted)
|
|
19
|
+
return { ok: false, status: 403, error: "Project is not trusted; capability writes are disabled." };
|
|
20
|
+
const capabilities = runtime.readCapabilities().filter(capability => trusted || capability.scope === "global");
|
|
21
|
+
const catalog = createResourceCatalog([...capabilities]);
|
|
22
|
+
const entry = (loaded) => {
|
|
23
|
+
const sourceRevision = loaded.sourceRevision ?? "";
|
|
24
|
+
return { selector: formatResourceKey(loaded.key), scope: loaded.scope, filePath: loaded.filePath,
|
|
25
|
+
capability: loaded.capability, diagnostics: loaded.diagnostics, sourceRevision };
|
|
26
|
+
};
|
|
27
|
+
if (action === "list")
|
|
28
|
+
return { ok: true, trusted, capabilities: capabilities.map(entry) };
|
|
29
|
+
if (action === "effective") {
|
|
30
|
+
if (!objectWithKeys(input, ["presetSelector", "bindings"]) || typeof input.presetSelector !== "string" || !Array.isArray(input.bindings)) {
|
|
31
|
+
return { ok: false, status: 400, error: "Expected presetSelector and bindings." };
|
|
32
|
+
}
|
|
33
|
+
const preset = runtime.getStacks().filter(stack => formatResourceKey(stack.key) === input.presetSelector && (trusted || stack.scope === "global"));
|
|
34
|
+
if (preset.length !== 1)
|
|
35
|
+
return { ok: false, status: 404, error: "Unknown or ambiguous qualified Preset selector." };
|
|
36
|
+
const resolved = resolveCapabilityBindings(catalog, preset[0].key, input.bindings);
|
|
37
|
+
if (!resolved.ok)
|
|
38
|
+
return { ok: false, status: 400, error: resolved.error };
|
|
39
|
+
return { ok: true, bindings: resolved.bindings.map(binding => {
|
|
40
|
+
const source = resolveCapability(catalog, formatResourceKey(binding.ref));
|
|
41
|
+
if (!source.ok)
|
|
42
|
+
throw new Error(source.error);
|
|
43
|
+
return { id: binding.id, ref: formatResourceKey(binding.ref), modelCallable: binding.modelCallable,
|
|
44
|
+
source: source.loaded.capability, effective: binding.capability };
|
|
45
|
+
}) };
|
|
46
|
+
}
|
|
47
|
+
if (action === "create") {
|
|
48
|
+
if (!objectWithKeys(input, ["scope", "capability"]) || (input.scope !== "global" && input.scope !== "project") || !input.capability || typeof input.capability !== "object") {
|
|
49
|
+
return { ok: false, status: 400, error: "Expected explicit scope and capability." };
|
|
50
|
+
}
|
|
51
|
+
const capability = input.capability;
|
|
52
|
+
if (typeof capability.id !== "string" || !isValidResourceId(capability.id))
|
|
53
|
+
return { ok: false, status: 400, error: "Invalid capability ID." };
|
|
54
|
+
if (capabilities.some(item => item.scope === input.scope && item.key.id === capability.id))
|
|
55
|
+
return { ok: false, status: 409, error: "Capability ID already exists in this scope." };
|
|
56
|
+
const path = join(input.scope === "global" ? globalCapabilitiesDir() : capabilitiesDir(ctx.cwd), `${capability.id}.json`);
|
|
57
|
+
const result = writeCapabilityFile(ctx.cwd, input.scope, path, capability, { overwrite: false });
|
|
58
|
+
if (!result.ok)
|
|
59
|
+
return mutationFailure(result);
|
|
60
|
+
runtime.readCapabilities();
|
|
61
|
+
return {
|
|
62
|
+
ok: true,
|
|
63
|
+
changed: formatResourceKey({ scope: input.scope, id: capability.id }),
|
|
64
|
+
sourceRevision: createHash("sha256").update(serializeCapability(capability)).digest("hex"),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const parsed = parseResourceSelector(selector ?? "");
|
|
68
|
+
if (!parsed.ok || !parsed.selector.scope)
|
|
69
|
+
return { ok: false, status: 400, error: "A qualified capability selector is required." };
|
|
70
|
+
const matches = capabilities.filter(item => formatResourceKey(item.key) === selector);
|
|
71
|
+
if (matches.length !== 1)
|
|
72
|
+
return { ok: false, status: matches.length ? 409 : 404, error: "Unknown or ambiguous capability." };
|
|
73
|
+
const loaded = matches[0];
|
|
74
|
+
if (action === "get")
|
|
75
|
+
return { ok: true, ...entry(loaded) };
|
|
76
|
+
if (!objectWithKeys(input, action === "delete" ? ["expectedSourceRevision"] : ["capability", "expectedSourceRevision"])
|
|
77
|
+
|| typeof input.expectedSourceRevision !== "string" || !/^[a-f0-9]{64}$/.test(input.expectedSourceRevision)) {
|
|
78
|
+
return { ok: false, status: 400, error: "A valid expectedSourceRevision is required." };
|
|
79
|
+
}
|
|
80
|
+
if (action === "save" && (!input.capability || typeof input.capability !== "object" || input.capability.id !== loaded.capability.id)) {
|
|
81
|
+
return { ok: false, status: 400, error: "Capability ID is immutable during save." };
|
|
82
|
+
}
|
|
83
|
+
const options = { overwrite: true, expectedSourceRevision: input.expectedSourceRevision };
|
|
84
|
+
const result = action === "delete"
|
|
85
|
+
? deleteCapabilityFile(ctx.cwd, loaded.scope, loaded.filePath, options)
|
|
86
|
+
: writeCapabilityFile(ctx.cwd, loaded.scope, loaded.filePath, input.capability, options);
|
|
87
|
+
if (!result.ok)
|
|
88
|
+
return mutationFailure(result);
|
|
89
|
+
runtime.readCapabilities();
|
|
90
|
+
return {
|
|
91
|
+
ok: true,
|
|
92
|
+
changed: selector,
|
|
93
|
+
...(action === "save" ? {
|
|
94
|
+
sourceRevision: createHash("sha256").update(serializeCapability(input.capability)).digest("hex"),
|
|
95
|
+
} : {}),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return { ok: false, status: 503, error: error instanceof Error ? error.message : "Capability resources unavailable." };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function mutationFailure(result) {
|
|
103
|
+
return { ok: false, status: result.reason === "conflict" ? 409 : result.reason === "invalid-path" ? 403 : result.reason === "invalid-capability" ? 400 : 500, error: result.error };
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=capability-web-host.js.map
|