@zihanw/pi-forge 0.5.4 → 0.5.6
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 +83 -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 +1 -0
- package/dist/agent-profile.d.ts.map +1 -1
- package/dist/agent-profile.js +20 -14
- 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 +1 -0
- package/dist/compile-cycle.d.ts.map +1 -1
- package/dist/compile-cycle.js.map +1 -1
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +81 -17
- package/dist/compiler.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 -5
- 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 +167 -67
- 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 +1 -0
- package/dist/preset-command.d.ts.map +1 -1
- package/dist/preset-command.js +94 -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 +132 -97
- package/dist/preview.js.map +1 -1
- package/dist/profile-command.js +68 -9
- package/dist/profile-command.js.map +1 -1
- 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 +93 -0
- package/dist/runtime/capability-runtime.d.ts.map +1 -0
- package/dist/runtime/capability-runtime.js +987 -0
- package/dist/runtime/capability-runtime.js.map +1 -0
- package/dist/runtime/profile-runtime.d.ts.map +1 -1
- package/dist/runtime/profile-runtime.js +10 -9
- package/dist/runtime/profile-runtime.js.map +1 -1
- package/dist/runtime/prompt-stack-runtime.d.ts +7 -4
- package/dist/runtime/prompt-stack-runtime.d.ts.map +1 -1
- package/dist/runtime/prompt-stack-runtime.js +47 -11
- package/dist/runtime/prompt-stack-runtime.js.map +1 -1
- package/dist/runtime/tool-policy-runtime.d.ts +10 -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 +573 -165
- 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 +9 -0
- package/dist/web-host.d.ts.map +1 -1
- package/dist/web-host.js +210 -11
- 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 -229
- package/docs/development/release.md +20 -20
- package/docs/development/roadmap.md +21 -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 +74 -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 +75 -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,160 @@
|
|
|
1
|
+
import { applyCapabilityOverrides, isUsableCapability, validateCapabilityBinding, } from "./codecs/capability.js";
|
|
2
|
+
import { formatResourceKey, isResourceScope, isValidResourceId, parseResourceSelector, } from "./resource-identity.js";
|
|
3
|
+
export const MAX_CAPABILITY_BINDINGS = 256;
|
|
4
|
+
/**
|
|
5
|
+
* Resolve a capability for direct browse/enable from a catalog.
|
|
6
|
+
* Bare selector uses project-over-global shadowing. Exact selector targets specific scope.
|
|
7
|
+
* Ambiguity or unusable shadowed capabilities fail closed without global fallback.
|
|
8
|
+
*/
|
|
9
|
+
export function resolveCapability(catalog, selector) {
|
|
10
|
+
if (!catalog || !Array.isArray(catalog.all))
|
|
11
|
+
return { ok: false, error: "Invalid resource catalog." };
|
|
12
|
+
if (typeof selector !== "string")
|
|
13
|
+
return { ok: false, error: "Capability capability selector must be a string." };
|
|
14
|
+
const parsed = parseResourceSelector(selector);
|
|
15
|
+
if (!parsed.ok)
|
|
16
|
+
return { ok: false, error: parsed.error };
|
|
17
|
+
const { scope, id } = parsed.selector;
|
|
18
|
+
const checkScope = (targetScope) => {
|
|
19
|
+
const matches = catalog.all.filter((m) => m.key.scope === targetScope && m.key.id === id);
|
|
20
|
+
if (matches.length > 1) {
|
|
21
|
+
return { ok: false, error: `Ambiguous capability "${targetScope}:${id}": multiple definitions found.` };
|
|
22
|
+
}
|
|
23
|
+
if (matches.length === 1) {
|
|
24
|
+
const loaded = matches[0];
|
|
25
|
+
if (!isUsableCapability(loaded)) {
|
|
26
|
+
const detail = loaded.diagnostics.find((d) => d.level === "error")?.message ?? "Capability capability has errors.";
|
|
27
|
+
return { ok: false, error: `Capability capability "${targetScope}:${id}" has errors: ${detail}` };
|
|
28
|
+
}
|
|
29
|
+
return { ok: true, loaded: deepFreeze(cloneLoadedCapability(loaded)) };
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
};
|
|
33
|
+
if (scope) {
|
|
34
|
+
const res = checkScope(scope);
|
|
35
|
+
return res ?? { ok: false, error: `Capability capability "${formatResourceKey({ scope, id })}" not found.` };
|
|
36
|
+
}
|
|
37
|
+
return checkScope("project") ?? checkScope("global") ?? { ok: false, error: `Capability capability "${id}" not found.` };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve capability bindings for a prompt stack preset.
|
|
41
|
+
* Bare refs strictly inherit preset scope. Global presets cannot bind project capabilities.
|
|
42
|
+
* Validates preset key, binding schemas, and duplicate effective IDs before resolving.
|
|
43
|
+
*/
|
|
44
|
+
export function resolveCapabilityBindings(catalog, preset, bindings) {
|
|
45
|
+
if (!isPlainObject(preset))
|
|
46
|
+
return { ok: false, error: "Preset key must be a plain object." };
|
|
47
|
+
const presetKeys = Object.keys(preset);
|
|
48
|
+
if (presetKeys.length !== 2 || !("scope" in preset) || !("id" in preset)) {
|
|
49
|
+
return { ok: false, error: "Preset key must only contain scope and id." };
|
|
50
|
+
}
|
|
51
|
+
if (!isResourceScope(preset.scope)) {
|
|
52
|
+
return { ok: false, error: 'Invalid preset scope. Expected "global" or "project".' };
|
|
53
|
+
}
|
|
54
|
+
if (typeof preset.id !== "string" || !isValidResourceId(preset.id)) {
|
|
55
|
+
return { ok: false, error: "Invalid preset id; expected the resource ID grammar." };
|
|
56
|
+
}
|
|
57
|
+
if (bindings === null || bindings === undefined || !Array.isArray(bindings)) {
|
|
58
|
+
return { ok: false, error: "Bindings must be an array." };
|
|
59
|
+
}
|
|
60
|
+
if (bindings.length > MAX_CAPABILITY_BINDINGS) {
|
|
61
|
+
return {
|
|
62
|
+
ok: false,
|
|
63
|
+
error: `Exceeded maximum bindings limit of ${MAX_CAPABILITY_BINDINGS} (got ${bindings.length}).`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (!catalog || !Array.isArray(catalog.all))
|
|
67
|
+
return { ok: false, error: "Invalid resource catalog." };
|
|
68
|
+
// 1. Validate each binding schema
|
|
69
|
+
for (let i = 0; i < bindings.length; i++) {
|
|
70
|
+
const diags = validateCapabilityBinding(bindings[i], preset.scope);
|
|
71
|
+
const err = diags.find((d) => d.level === "error");
|
|
72
|
+
if (err)
|
|
73
|
+
return { ok: false, error: err.message, index: i };
|
|
74
|
+
}
|
|
75
|
+
// 2. Check duplicate effective binding IDs
|
|
76
|
+
const seenIds = new Set();
|
|
77
|
+
for (let i = 0; i < bindings.length; i++) {
|
|
78
|
+
const b = bindings[i];
|
|
79
|
+
const parsed = parseResourceSelector(b.ref);
|
|
80
|
+
const effectiveId = b.id ?? (parsed.ok ? parsed.selector.id : "");
|
|
81
|
+
if (seenIds.has(effectiveId)) {
|
|
82
|
+
return { ok: false, error: `Duplicate binding id "${effectiveId}" at index ${i}.`, index: i };
|
|
83
|
+
}
|
|
84
|
+
seenIds.add(effectiveId);
|
|
85
|
+
}
|
|
86
|
+
// 3. Resolve resources and apply overrides via direct exact resolve
|
|
87
|
+
const resolvedList = [];
|
|
88
|
+
for (let i = 0; i < bindings.length; i++) {
|
|
89
|
+
const b = bindings[i];
|
|
90
|
+
const parsed = parseResourceSelector(b.ref);
|
|
91
|
+
const targetScope = parsed.ok && parsed.selector.scope ? parsed.selector.scope : preset.scope;
|
|
92
|
+
const targetId = parsed.ok ? parsed.selector.id : "";
|
|
93
|
+
const qualifiedTarget = formatResourceKey({ scope: targetScope, id: targetId });
|
|
94
|
+
const effectiveId = b.id ?? targetId;
|
|
95
|
+
const directResolve = resolveCapability(catalog, qualifiedTarget);
|
|
96
|
+
if (!directResolve.ok) {
|
|
97
|
+
return { ok: false, error: directResolve.error, index: i };
|
|
98
|
+
}
|
|
99
|
+
const loaded = directResolve.loaded;
|
|
100
|
+
const overrideResult = applyCapabilityOverrides(loaded.capability, b.overrides);
|
|
101
|
+
if (!overrideResult.ok) {
|
|
102
|
+
const detail = overrideResult.diagnostics.find((d) => d.level === "error")?.message ?? "Failed to apply overrides.";
|
|
103
|
+
return { ok: false, error: `Failed to apply overrides to "${effectiveId}": ${detail}`, index: i };
|
|
104
|
+
}
|
|
105
|
+
const resolved = {
|
|
106
|
+
id: effectiveId,
|
|
107
|
+
ref: { scope: targetScope, id: targetId },
|
|
108
|
+
preset: { scope: preset.scope, id: preset.id },
|
|
109
|
+
modelCallable: b.modelCallable === true,
|
|
110
|
+
capability: cloneCapability(overrideResult.capability),
|
|
111
|
+
};
|
|
112
|
+
deepFreeze(resolved);
|
|
113
|
+
resolvedList.push(resolved);
|
|
114
|
+
}
|
|
115
|
+
return { ok: true, bindings: Object.freeze(resolvedList) };
|
|
116
|
+
}
|
|
117
|
+
function cloneLoadedCapability(loaded) {
|
|
118
|
+
return {
|
|
119
|
+
filePath: loaded.filePath,
|
|
120
|
+
scope: loaded.scope,
|
|
121
|
+
key: { scope: loaded.key.scope, id: loaded.key.id },
|
|
122
|
+
capability: cloneCapability(loaded.capability),
|
|
123
|
+
diagnostics: loaded.diagnostics.map((d) => ({ ...d })),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function cloneCapability(capability) {
|
|
127
|
+
return {
|
|
128
|
+
schemaVersion: capability.schemaVersion,
|
|
129
|
+
type: capability.type,
|
|
130
|
+
id: capability.id,
|
|
131
|
+
...(capability.name !== undefined ? { name: capability.name } : {}),
|
|
132
|
+
...(capability.description !== undefined ? { description: capability.description } : {}),
|
|
133
|
+
content: capability.content,
|
|
134
|
+
tools: {
|
|
135
|
+
add: [...capability.tools.add],
|
|
136
|
+
remove: [...capability.tools.remove],
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function deepFreeze(obj) {
|
|
141
|
+
if (obj === null || typeof obj !== "object")
|
|
142
|
+
return obj;
|
|
143
|
+
if (Object.isFrozen(obj))
|
|
144
|
+
return obj;
|
|
145
|
+
for (const key of Object.keys(obj)) {
|
|
146
|
+
const val = obj[key];
|
|
147
|
+
if (val !== null && typeof val === "object") {
|
|
148
|
+
deepFreeze(val);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return Object.freeze(obj);
|
|
152
|
+
}
|
|
153
|
+
function isPlainObject(value) {
|
|
154
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
const proto = Object.getPrototypeOf(value);
|
|
158
|
+
return proto === Object.prototype || proto === null;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { type CapabilityAnchorData } from "./capability-protocol.ts";
|
|
3
|
+
export type { CapabilityAnchorData };
|
|
4
|
+
/**
|
|
5
|
+
* Validates the metadata payload of a plain capability delivery anchor entry.
|
|
6
|
+
* Enforces strict schema constraints:
|
|
7
|
+
* - Must be a non-null object with no extra fields.
|
|
8
|
+
* - schemaVersion must be 1.
|
|
9
|
+
* - throughEventId must be a non-empty string, length <= 128, containing no control characters.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateCapabilityAnchorData(data: unknown): CapabilityAnchorData;
|
|
12
|
+
/**
|
|
13
|
+
* Checks if a session entry is a plain metadata anchor for capability delivery.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isCapabilityAnchorEntry(entry: unknown): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Creates an ephemeral in-memory custom control message for a plain metadata anchor entry.
|
|
18
|
+
* Used during context projection and Preview manual context assembly.
|
|
19
|
+
* Returns undefined if the entry is not a custom capability delivery anchor.
|
|
20
|
+
* Throws if the entry is an anchor with invalid metadata.
|
|
21
|
+
*/
|
|
22
|
+
export declare function capabilityAnchorMessage(entry: unknown): AgentMessage | undefined;
|
|
23
|
+
export declare function capabilityContextMatches(expected: readonly AgentMessage[], incoming: readonly AgentMessage[]): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Materializes plain metadata anchors into context messages at their exact ordinal positions.
|
|
26
|
+
*
|
|
27
|
+
* Rules:
|
|
28
|
+
* - If no visible plain metadata anchor exists in context entries, returns the original messages array.
|
|
29
|
+
* - If visible anchors exist, validates their metadata and checks the ordered protocol alignment before injection (see capabilityContextMatches).
|
|
30
|
+
* - Preserves all original message object references from incoming messages.
|
|
31
|
+
* - Never guesses by timestamps or text matching; fails closed if context was modified by preceding extensions.
|
|
32
|
+
*/
|
|
33
|
+
export declare function materializeCapabilityAnchors(entries: readonly unknown[], messages: AgentMessage[], leafId?: string | null): AgentMessage[];
|
|
34
|
+
/**
|
|
35
|
+
* Checks whether the current turn has in-flight or unresolved tool calls.
|
|
36
|
+
*
|
|
37
|
+
* Turn scoping rule:
|
|
38
|
+
* - Real user messages (`role: "user"`) define a new user turn and clear any
|
|
39
|
+
* historical orphan tool calls left by interrupted or crashed earlier turns.
|
|
40
|
+
* - Custom peer messages (`role: "custom"`) do not establish a new user boundary
|
|
41
|
+
* and do not clear pending calls.
|
|
42
|
+
* - Assistant tool calls add to the pending set; matching toolResult messages remove them.
|
|
43
|
+
*/
|
|
44
|
+
export declare function hasPendingCapabilityToolCalls(messages: readonly AgentMessage[]): boolean;
|
|
45
|
+
//# sourceMappingURL=capability-anchors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-anchors.d.ts","sourceRoot":"","sources":["../src/capability-anchors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAKlE,OAAO,EAEN,KAAK,oBAAoB,EACzB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAKrC;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,oBAAoB,CAgDhF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI/D;AAeD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAmBhF;AA+CD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAEtH;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC3C,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,QAAQ,EAAE,YAAY,EAAE,EACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,YAAY,EAAE,CAqEhB;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CA0CxF"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from "node:util";
|
|
2
|
+
import { buildSessionProjection, } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { CAPABILITY_DELIVERY_TYPE, } from "./capability-protocol.js";
|
|
4
|
+
const CONTROL_CHAR_PATTERN = /[\u0000-\u001F\u007F-\u009F]/;
|
|
5
|
+
const MAX_CURSOR_LENGTH = 128;
|
|
6
|
+
/**
|
|
7
|
+
* Validates the metadata payload of a plain capability delivery anchor entry.
|
|
8
|
+
* Enforces strict schema constraints:
|
|
9
|
+
* - Must be a non-null object with no extra fields.
|
|
10
|
+
* - schemaVersion must be 1.
|
|
11
|
+
* - throughEventId must be a non-empty string, length <= 128, containing no control characters.
|
|
12
|
+
*/
|
|
13
|
+
export function validateCapabilityAnchorData(data) {
|
|
14
|
+
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
15
|
+
throw new Error("Invalid capability anchor metadata: data must be a non-null object");
|
|
16
|
+
}
|
|
17
|
+
const record = data;
|
|
18
|
+
const keys = Object.keys(record);
|
|
19
|
+
for (const key of keys) {
|
|
20
|
+
if (key !== "schemaVersion" && key !== "throughEventId") {
|
|
21
|
+
throw new Error(`Invalid capability anchor metadata: unexpected extra field "${key}"`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (Object.getOwnPropertySymbols(record).length > 0) {
|
|
25
|
+
throw new Error("Invalid capability anchor metadata: unexpected symbol property");
|
|
26
|
+
}
|
|
27
|
+
if (!("schemaVersion" in record)) {
|
|
28
|
+
throw new Error("Invalid capability anchor metadata: missing required field schemaVersion");
|
|
29
|
+
}
|
|
30
|
+
if (!("throughEventId" in record)) {
|
|
31
|
+
throw new Error("Invalid capability anchor metadata: missing required field throughEventId");
|
|
32
|
+
}
|
|
33
|
+
if (record.schemaVersion !== 1) {
|
|
34
|
+
throw new Error(`Invalid capability anchor metadata: unsupported schemaVersion ${String(record.schemaVersion)}, expected 1`);
|
|
35
|
+
}
|
|
36
|
+
const throughEventId = record.throughEventId;
|
|
37
|
+
if (typeof throughEventId !== "string" || throughEventId.length === 0) {
|
|
38
|
+
throw new Error("Invalid capability anchor metadata: throughEventId must be a non-empty string");
|
|
39
|
+
}
|
|
40
|
+
if (throughEventId.length > MAX_CURSOR_LENGTH) {
|
|
41
|
+
throw new Error(`Invalid capability anchor metadata: throughEventId length exceeds ${MAX_CURSOR_LENGTH} characters (${throughEventId.length})`);
|
|
42
|
+
}
|
|
43
|
+
if (CONTROL_CHAR_PATTERN.test(throughEventId)) {
|
|
44
|
+
throw new Error("Invalid capability anchor metadata: throughEventId contains control characters");
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
schemaVersion: 1,
|
|
48
|
+
throughEventId,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Checks if a session entry is a plain metadata anchor for capability delivery.
|
|
53
|
+
*/
|
|
54
|
+
export function isCapabilityAnchorEntry(entry) {
|
|
55
|
+
if (!entry || typeof entry !== "object")
|
|
56
|
+
return false;
|
|
57
|
+
const record = entry;
|
|
58
|
+
return record.type === "custom" && record.customType === CAPABILITY_DELIVERY_TYPE;
|
|
59
|
+
}
|
|
60
|
+
function parseEntryTimestamp(timestamp) {
|
|
61
|
+
if (typeof timestamp === "number" && Number.isFinite(timestamp)) {
|
|
62
|
+
return timestamp;
|
|
63
|
+
}
|
|
64
|
+
if (typeof timestamp === "string") {
|
|
65
|
+
const parsed = Date.parse(timestamp);
|
|
66
|
+
if (Number.isFinite(parsed)) {
|
|
67
|
+
return parsed;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Creates an ephemeral in-memory custom control message for a plain metadata anchor entry.
|
|
74
|
+
* Used during context projection and Preview manual context assembly.
|
|
75
|
+
* Returns undefined if the entry is not a custom capability delivery anchor.
|
|
76
|
+
* Throws if the entry is an anchor with invalid metadata.
|
|
77
|
+
*/
|
|
78
|
+
export function capabilityAnchorMessage(entry) {
|
|
79
|
+
if (!isCapabilityAnchorEntry(entry)) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const rawEntry = entry;
|
|
83
|
+
const data = validateCapabilityAnchorData(rawEntry.data);
|
|
84
|
+
return {
|
|
85
|
+
role: "custom",
|
|
86
|
+
customType: CAPABILITY_DELIVERY_TYPE,
|
|
87
|
+
content: [],
|
|
88
|
+
display: false,
|
|
89
|
+
details: {
|
|
90
|
+
schemaVersion: data.schemaVersion,
|
|
91
|
+
throughEventId: data.throughEventId,
|
|
92
|
+
},
|
|
93
|
+
timestamp: parseEntryTimestamp(rawEntry.timestamp),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Compare stable protocol fields; Pi regenerates custom-message envelope timestamps. */
|
|
97
|
+
function sameContextMessage(expected, incoming) {
|
|
98
|
+
if (expected.role !== "custom" || incoming.role !== "custom")
|
|
99
|
+
return isDeepStrictEqual(expected, incoming);
|
|
100
|
+
const { timestamp: _expectedTime, ...expectedFields } = expected;
|
|
101
|
+
const { timestamp: _incomingTime, ...incomingFields } = incoming;
|
|
102
|
+
return isDeepStrictEqual(expectedFields, incomingFields);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Pi can persist queued custom messages without including them in the current
|
|
106
|
+
* tool follow-up context. All non-custom messages must match exactly. Within a
|
|
107
|
+
* custom-message run, admit omission only when earliest and latest ordered
|
|
108
|
+
* alignments agree. Ambiguous duplicates fail; no text/time proximity heuristic,
|
|
109
|
+
* insertion, body rewrite, or replacement of caller-owned context is permitted.
|
|
110
|
+
* The result maps expected message positions to incoming positions (or omission).
|
|
111
|
+
*/
|
|
112
|
+
function contextAlignment(expected, incoming) {
|
|
113
|
+
const mapping = new Array(expected.length);
|
|
114
|
+
let e = 0, i = 0;
|
|
115
|
+
while (e < expected.length || i < incoming.length) {
|
|
116
|
+
if (expected[e]?.role !== "custom") {
|
|
117
|
+
if (!expected[e] || !incoming[i] || !sameContextMessage(expected[e], incoming[i]))
|
|
118
|
+
return undefined;
|
|
119
|
+
mapping[e++] = i++;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const expectedStart = e, incomingStart = i;
|
|
123
|
+
while (expected[e]?.role === "custom")
|
|
124
|
+
e++;
|
|
125
|
+
while (incoming[i]?.role === "custom")
|
|
126
|
+
i++;
|
|
127
|
+
const earliest = [];
|
|
128
|
+
let cursor = expectedStart;
|
|
129
|
+
for (let current = incomingStart; current < i; current++) {
|
|
130
|
+
while (cursor < e && !sameContextMessage(expected[cursor], incoming[current]))
|
|
131
|
+
cursor++;
|
|
132
|
+
if (cursor === e)
|
|
133
|
+
return undefined;
|
|
134
|
+
earliest.push(cursor++);
|
|
135
|
+
}
|
|
136
|
+
cursor = e - 1;
|
|
137
|
+
for (let current = i - 1; current >= incomingStart; current--) {
|
|
138
|
+
while (cursor >= expectedStart && !sameContextMessage(expected[cursor], incoming[current]))
|
|
139
|
+
cursor--;
|
|
140
|
+
if (cursor !== earliest[current - incomingStart])
|
|
141
|
+
return undefined;
|
|
142
|
+
mapping[cursor--] = current;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return mapping;
|
|
146
|
+
}
|
|
147
|
+
export function capabilityContextMatches(expected, incoming) {
|
|
148
|
+
return contextAlignment(expected, incoming) !== undefined;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Materializes plain metadata anchors into context messages at their exact ordinal positions.
|
|
152
|
+
*
|
|
153
|
+
* Rules:
|
|
154
|
+
* - If no visible plain metadata anchor exists in context entries, returns the original messages array.
|
|
155
|
+
* - If visible anchors exist, validates their metadata and checks the ordered protocol alignment before injection (see capabilityContextMatches).
|
|
156
|
+
* - Preserves all original message object references from incoming messages.
|
|
157
|
+
* - Never guesses by timestamps or text matching; fails closed if context was modified by preceding extensions.
|
|
158
|
+
*/
|
|
159
|
+
export function materializeCapabilityAnchors(entries, messages, leafId) {
|
|
160
|
+
if (!Array.isArray(entries)) {
|
|
161
|
+
throw new TypeError("Invalid entries: expected an array");
|
|
162
|
+
}
|
|
163
|
+
if (!Array.isArray(messages)) {
|
|
164
|
+
throw new TypeError("Invalid messages: expected an array");
|
|
165
|
+
}
|
|
166
|
+
if (entries.length === 0) {
|
|
167
|
+
return messages;
|
|
168
|
+
}
|
|
169
|
+
const projection = buildSessionProjection(entries, leafId);
|
|
170
|
+
let hasVisibleAnchor = false;
|
|
171
|
+
for (const projectedEntry of projection.entries) {
|
|
172
|
+
const sourceEntry = projectedEntry.sourceEntry;
|
|
173
|
+
if (isCapabilityAnchorEntry(sourceEntry)) {
|
|
174
|
+
hasVisibleAnchor = true;
|
|
175
|
+
validateCapabilityAnchorData(sourceEntry.data);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (!hasVisibleAnchor) {
|
|
179
|
+
return messages;
|
|
180
|
+
}
|
|
181
|
+
const alignment = contextAlignment(projection.messages, messages);
|
|
182
|
+
if (!alignment) {
|
|
183
|
+
throw new Error("Cannot materialize capability anchors: context has no unique session alignment (possible preceding extension rewrite or deferred custom messages)");
|
|
184
|
+
}
|
|
185
|
+
const materialized = [];
|
|
186
|
+
let projectedMessageIndex = 0;
|
|
187
|
+
for (const projectedEntry of projection.entries) {
|
|
188
|
+
const sourceEntry = projectedEntry.sourceEntry;
|
|
189
|
+
if (isCapabilityAnchorEntry(sourceEntry)) {
|
|
190
|
+
const anchorMessage = capabilityAnchorMessage(sourceEntry);
|
|
191
|
+
if (anchorMessage) {
|
|
192
|
+
materialized.push(anchorMessage);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
for (const _projectedMessage of projectedEntry.messages) {
|
|
196
|
+
const incomingIndex = alignment[projectedMessageIndex++];
|
|
197
|
+
if (incomingIndex !== undefined)
|
|
198
|
+
materialized.push(messages[incomingIndex]);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (projectedMessageIndex !== projection.messages.length) {
|
|
202
|
+
throw new Error(`Cannot materialize capability anchors: context message count mismatch (processed ${projectedMessageIndex} of ${projection.messages.length} projected session messages)`);
|
|
203
|
+
}
|
|
204
|
+
// Idle changes can predate Pi's first persisted System entry. Their temporary
|
|
205
|
+
// controls must not displace the request head (especially user fallback).
|
|
206
|
+
// Cross only our injected prefix markers, never reorder incoming dialogue.
|
|
207
|
+
if (messages[0]?.role === "system") {
|
|
208
|
+
const headIndex = materialized.indexOf(messages[0]);
|
|
209
|
+
if (headIndex > 0) {
|
|
210
|
+
materialized.splice(headIndex, 1);
|
|
211
|
+
materialized.unshift(messages[0]);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return materialized;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Checks whether the current turn has in-flight or unresolved tool calls.
|
|
218
|
+
*
|
|
219
|
+
* Turn scoping rule:
|
|
220
|
+
* - Real user messages (`role: "user"`) define a new user turn and clear any
|
|
221
|
+
* historical orphan tool calls left by interrupted or crashed earlier turns.
|
|
222
|
+
* - Custom peer messages (`role: "custom"`) do not establish a new user boundary
|
|
223
|
+
* and do not clear pending calls.
|
|
224
|
+
* - Assistant tool calls add to the pending set; matching toolResult messages remove them.
|
|
225
|
+
*/
|
|
226
|
+
export function hasPendingCapabilityToolCalls(messages) {
|
|
227
|
+
if (!Array.isArray(messages))
|
|
228
|
+
return false;
|
|
229
|
+
const pending = new Set();
|
|
230
|
+
for (const msg of messages) {
|
|
231
|
+
if (!msg || typeof msg !== "object")
|
|
232
|
+
continue;
|
|
233
|
+
if (msg.role === "user") {
|
|
234
|
+
pending.clear();
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (msg.role === "assistant") {
|
|
238
|
+
const assistant = msg;
|
|
239
|
+
if (Array.isArray(assistant.content)) {
|
|
240
|
+
for (const block of assistant.content) {
|
|
241
|
+
if (block
|
|
242
|
+
&& typeof block === "object"
|
|
243
|
+
&& block.type === "toolCall") {
|
|
244
|
+
const id = block.id;
|
|
245
|
+
if (typeof id === "string" && id.length > 0) {
|
|
246
|
+
pending.add(id);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (msg.role === "toolResult") {
|
|
254
|
+
const toolResult = msg;
|
|
255
|
+
if (typeof toolResult.toolCallId === "string" && toolResult.toolCallId.length > 0) {
|
|
256
|
+
pending.delete(toolResult.toolCallId);
|
|
257
|
+
}
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return pending.size > 0;
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=capability-anchors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-anchors.js","sourceRoot":"","sources":["../src/capability-anchors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { CapabilityRuntime } from "./runtime/capability-runtime.ts";
|
|
3
|
+
export declare function registerCapabilityCommand(pi: ExtensionAPI, runtime: CapabilityRuntime): void;
|
|
4
|
+
//# sourceMappingURL=capability-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-command.d.ts","sourceRoot":"","sources":["../src/capability-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,iCAAiC,CAAC;AAG7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAKzE,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAS5F"}
|