@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/web-editor/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/web-editor/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8sDtC,CAAC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import type { Capability, Diagnostic } from "../codecs/capability.ts";
|
|
1
2
|
import type { AgentProfile, AgentProfileDiagnostic } from "../agent-profile.ts";
|
|
2
3
|
import type { AgentProfilePreview, AgentProfileRuntimeStatus } from "../profile-service.ts";
|
|
3
4
|
import type { UiContributionTransport } from "../ui-contribution/contrib-port.ts";
|
|
4
5
|
import type { ContextDiffView } from "../context-diff-history.ts";
|
|
6
|
+
import type { CapabilityAvailableResult, CapabilityStateResult, CapabilityStateView } from "../capability-state.ts";
|
|
5
7
|
import type { PromptStack, PromptStackDiagnostic } from "../types.ts";
|
|
8
|
+
import type { LoadedCapability } from "../codecs/capability.ts";
|
|
6
9
|
export interface WebEditorStackSummary {
|
|
7
10
|
id: string;
|
|
8
11
|
selector: string;
|
|
@@ -18,8 +21,22 @@ export interface WebEditorStackSummary {
|
|
|
18
21
|
diagnostics: PromptStackDiagnostic[];
|
|
19
22
|
}
|
|
20
23
|
export type WebEditorLocale = "en" | "zh-CN" | "auto";
|
|
24
|
+
export type WebEditorCapabilityOperation = "list" | "get" | "create" | "save" | "delete" | "effective";
|
|
25
|
+
export interface WebEditorCapabilityMutation {
|
|
26
|
+
changed: string;
|
|
27
|
+
sourceRevision?: string;
|
|
28
|
+
}
|
|
29
|
+
export type WebEditorCapabilityResult = WebEditorOperationResult<WebEditorCapabilityCollection | WebEditorCapabilityEntry | WebEditorEffectiveCapabilityCollection | WebEditorCapabilityMutation>;
|
|
21
30
|
export interface WebEditorHost {
|
|
31
|
+
capabilityOperation?(action: WebEditorCapabilityOperation, selector?: string, input?: unknown): WebEditorCapabilityResult;
|
|
22
32
|
cwd: string;
|
|
33
|
+
isProjectTrusted?(): boolean;
|
|
34
|
+
readCapabilities?(): readonly LoadedCapability[];
|
|
35
|
+
readCapabilityState?(): CapabilityStateResult;
|
|
36
|
+
readCapabilityChoices?(): CapabilityAvailableResult;
|
|
37
|
+
mutateCapabilityState?(input: unknown): CapabilityStateResult;
|
|
38
|
+
enableCapability?(input: unknown): CapabilityStateResult;
|
|
39
|
+
previewCapabilities?(): WebEditorOperationResult<WebEditorSessionPreview>;
|
|
23
40
|
getEditorConfig(): {
|
|
24
41
|
locale: WebEditorLocale;
|
|
25
42
|
};
|
|
@@ -39,14 +56,18 @@ export interface WebEditorHost {
|
|
|
39
56
|
stack: PromptStack;
|
|
40
57
|
filePath: string;
|
|
41
58
|
diagnostics: PromptStackDiagnostic[];
|
|
59
|
+
sourceRevision: string;
|
|
60
|
+
selector?: string;
|
|
61
|
+
scope?: "global" | "project";
|
|
42
62
|
} | undefined;
|
|
43
63
|
createStack(stack: PromptStack, options: WebEditorCreateStackOptions): Promise<WebEditorOperationResult<{
|
|
44
64
|
stack: WebEditorStackSummary;
|
|
45
65
|
stacks: WebEditorStackSummary[];
|
|
46
66
|
}>>;
|
|
47
|
-
saveStack(id: string, stack: PromptStack): Promise<WebEditorOperationResult<{
|
|
67
|
+
saveStack(id: string, stack: PromptStack, expectedSourceRevision?: string): Promise<WebEditorOperationResult<{
|
|
48
68
|
stack: WebEditorStackSummary;
|
|
49
69
|
stacks: WebEditorStackSummary[];
|
|
70
|
+
sourceRevision: string;
|
|
50
71
|
}>>;
|
|
51
72
|
deleteStack(id: string): Promise<WebEditorOperationResult<{
|
|
52
73
|
activeId?: string;
|
|
@@ -75,6 +96,28 @@ export interface WebEditorHost {
|
|
|
75
96
|
stacks: WebEditorStackSummary[];
|
|
76
97
|
}>>;
|
|
77
98
|
}
|
|
99
|
+
export interface WebEditorCapabilityEntry {
|
|
100
|
+
selector: string;
|
|
101
|
+
scope: "global" | "project";
|
|
102
|
+
filePath: string;
|
|
103
|
+
capability: Capability;
|
|
104
|
+
sourceRevision: string;
|
|
105
|
+
diagnostics: Diagnostic[];
|
|
106
|
+
}
|
|
107
|
+
export interface WebEditorCapabilityCollection {
|
|
108
|
+
trusted: boolean;
|
|
109
|
+
capabilities: WebEditorCapabilityEntry[];
|
|
110
|
+
}
|
|
111
|
+
export interface WebEditorEffectiveCapabilityBinding {
|
|
112
|
+
id: string;
|
|
113
|
+
ref: string;
|
|
114
|
+
modelCallable: boolean;
|
|
115
|
+
source: Capability;
|
|
116
|
+
effective: Capability;
|
|
117
|
+
}
|
|
118
|
+
export interface WebEditorEffectiveCapabilityCollection {
|
|
119
|
+
bindings: WebEditorEffectiveCapabilityBinding[];
|
|
120
|
+
}
|
|
78
121
|
export interface WebEditorProfileEntry {
|
|
79
122
|
profile: AgentProfile;
|
|
80
123
|
filePath: string;
|
|
@@ -120,7 +163,26 @@ export interface WebEditorPreviewSection {
|
|
|
120
163
|
diffKey?: string;
|
|
121
164
|
title: string;
|
|
122
165
|
role?: string;
|
|
166
|
+
/** Message body only; structural fields are never synthesized into prose. */
|
|
123
167
|
content: string;
|
|
168
|
+
/** Native named System sections, including explicit removals (null). */
|
|
169
|
+
sections?: Record<string, string | null>;
|
|
170
|
+
/** Read-only instruction projection metadata; not prompt prose or executable state. */
|
|
171
|
+
capabilityUpdate?: {
|
|
172
|
+
activationIds: string[];
|
|
173
|
+
kind: "anchor" | "pending" | "checkpoint";
|
|
174
|
+
throughEventId: string;
|
|
175
|
+
};
|
|
176
|
+
/** Recorded transcript declarations, NOT current executable tool selection. */
|
|
177
|
+
toolChanges?: {
|
|
178
|
+
added: Array<{
|
|
179
|
+
name: string;
|
|
180
|
+
description?: string;
|
|
181
|
+
parameters?: unknown;
|
|
182
|
+
}>;
|
|
183
|
+
removed: string[];
|
|
184
|
+
};
|
|
185
|
+
/** Text-only counts: body plus named section values, excluding tool schemas. */
|
|
124
186
|
chars: number;
|
|
125
187
|
approxTokens: number;
|
|
126
188
|
}
|
|
@@ -129,9 +191,21 @@ export interface WebEditorPreview {
|
|
|
129
191
|
generatedAt: string;
|
|
130
192
|
system: WebEditorPreviewSection;
|
|
131
193
|
messages: WebEditorPreviewSection[];
|
|
194
|
+
/** Evaluated draft policy + current instruction overlays, not historical declarations. */
|
|
195
|
+
selectedTools?: string[];
|
|
132
196
|
totalChars: number;
|
|
133
197
|
approxTokens: number;
|
|
134
198
|
}
|
|
199
|
+
export interface WebEditorSessionPreview {
|
|
200
|
+
state: CapabilityStateView;
|
|
201
|
+
preset: {
|
|
202
|
+
selector: string;
|
|
203
|
+
name?: string;
|
|
204
|
+
};
|
|
205
|
+
text: string;
|
|
206
|
+
preview: WebEditorPreview;
|
|
207
|
+
diagnostics: PromptStackDiagnostic[];
|
|
208
|
+
}
|
|
135
209
|
export interface WebEditorPayloadCapture {
|
|
136
210
|
capturedAt: string;
|
|
137
211
|
stackId?: string;
|
|
@@ -163,6 +237,12 @@ export interface WebEditorPolicyResource {
|
|
|
163
237
|
name: string;
|
|
164
238
|
description?: string;
|
|
165
239
|
source?: string;
|
|
240
|
+
group?: {
|
|
241
|
+
id: string;
|
|
242
|
+
label: string;
|
|
243
|
+
};
|
|
244
|
+
/** Restorable session baseline before Preset/capability selection, for default seeding. */
|
|
245
|
+
baselineActive?: boolean;
|
|
166
246
|
active?: boolean;
|
|
167
247
|
hidden?: boolean;
|
|
168
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web-editor/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web-editor/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACpH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACrC;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtD,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AACvG,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,yBAAyB,GAAG,wBAAwB,CAAC,6BAA6B,GAAG,wBAAwB,GAAG,sCAAsC,GAAG,2BAA2B,CAAC,CAAC;AAElM,MAAM,WAAW,aAAa;IAC7B,mBAAmB,CAAC,CAAC,MAAM,EAAE,4BAA4B,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;IAC1H,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,IAAI,OAAO,CAAC;IAC7B,gBAAgB,CAAC,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACjD,mBAAmB,CAAC,IAAI,qBAAqB,CAAC;IAC9C,qBAAqB,CAAC,IAAI,yBAAyB,CAAC;IACpD,qBAAqB,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAAC;IAC9D,gBAAgB,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAAC;IACzD,mBAAmB,CAAC,IAAI,wBAAwB,CAAC,uBAAuB,CAAC,CAAC;IAC1E,eAAe,IAAI;QAAE,MAAM,EAAE,eAAe,CAAA;KAAE,CAAC;IAC/C,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,wBAAwB,CAAC;QAAE,MAAM,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IAChG,UAAU,IAAI,qBAAqB,EAAE,CAAC;IACtC,YAAY,IAAI,0BAA0B,CAAC;IAC3C,cAAc,IAAI,OAAO,CAAC,wBAAwB,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAChF,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,0BAA0B,CAAC;IACtH,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,wBAAwB,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAChI,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,wBAAwB,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC5G,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACtF,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACvF,aAAa,IAAI,kBAAkB,CAAC;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,qBAAqB,EAAE,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IAC1L,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,wBAAwB,CAAC;QAAE,KAAK,EAAE,qBAAqB,CAAC;QAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAC,CAAC,CAAC;IAC5K,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;QAAE,KAAK,EAAE,qBAAqB,CAAC;QAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACzM,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAC,CAAC,CAAC;IACnH,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAC3D,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,wBAAwB,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;QAAC,WAAW,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAC,CAAC;IAC3J,UAAU,IAAI,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;IACjE,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;IAClF,YAAY,IAAI,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;IACnE,cAAc,IAAI,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAC5D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,wBAAwB,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAC,CAAC;IAC5G,aAAa,IAAI,wBAAwB,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAC,CAAC;IAClG,YAAY,IAAI,OAAO,CAAC,wBAAwB,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAC,CAAC,CAAC;CAC1G;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,6BAA6B;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,wBAAwB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,mCAAmC;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,sCAAsC;IACtD,QAAQ,EAAE,mCAAmC,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,MAAM,EAAE,yBAAyB,CAAC;IAClC,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACtC,YAAY,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CAClG;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,mBAAmB,CAAC;IAC7B,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACxC,UAAU,EAAE,0BAA0B,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,uFAAuF;IACvF,gBAAgB,CAAC,EAAE;QAClB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;QAC1C,cAAc,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,+EAA+E;IAC/E,WAAW,CAAC,EAAE;QACb,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QAC3E,OAAO,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,uBAAuB,CAAC;IAChC,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,wBAAwB,GACjC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,uBAAuB,CAAA;CAAE,CAAC;AAE5D,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oFAAoF;IACpF,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACxC,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,MAAM,EAAE,uBAAuB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB;IACnE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACrC,KAAK,EAAE,0BAA0B,EAAE,CAAC;CACpC;AAED,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC,CAAC,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7G,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,qBAAqB,CAAC,EAAE,uBAAuB,CAAC;IAChD,4EAA4E;IAC5E,6BAA6B,CAAC,EAAE,MAAM,CAAC;CACvC"}
|
package/dist/web-host.d.ts
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
|
+
import type { LoadedCapability } from "./codecs/capability.ts";
|
|
1
2
|
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
3
|
import { type AgentProfileProvenance, type LoadedAgentProfile, type ResolvedAgentProfile } from "./agent-profile.ts";
|
|
3
4
|
import { type AgentProfileApplicationResult, type AgentProfileCurrentRuntime } from "./profile-service.ts";
|
|
5
|
+
import { type CapabilityAvailableResult, type CapabilityStateResult } from "./capability-state.ts";
|
|
4
6
|
import type { ContextDiffView } from "./context-diff-history.ts";
|
|
5
7
|
import type { LoadedPromptStack, PromptStack, PromptStackDiagnostic } from "./types.ts";
|
|
6
8
|
import type { WebEditorLocale, WebEditorHost, WebEditorOperationResult, WebEditorPayloadSnapshot, WebEditorPolicyResources, WebEditorPreview, WebEditorStackSummary } from "./web-editor/index.ts";
|
|
7
9
|
export interface WebHostRuntime {
|
|
10
|
+
readCapabilities?(): readonly LoadedCapability[];
|
|
8
11
|
getStacks(): LoadedPromptStack[];
|
|
9
12
|
getActive(): LoadedPromptStack | undefined;
|
|
10
13
|
getActiveId(): string | undefined;
|
|
11
14
|
getSelectedActiveId(): string | undefined;
|
|
12
15
|
setActive(id: string | undefined): boolean;
|
|
16
|
+
lastActivationError?(): string | undefined;
|
|
17
|
+
validatePresetSwitch?(target: LoadedPromptStack): string | undefined;
|
|
13
18
|
reloadStacks(preferredId?: string): Promise<void>;
|
|
14
19
|
buildPreview(target: LoadedPromptStack): {
|
|
15
20
|
text: string;
|
|
@@ -29,6 +34,10 @@ export interface WebHostRuntime {
|
|
|
29
34
|
armPayload(savePath?: string): WebEditorOperationResult<WebEditorPayloadSnapshot>;
|
|
30
35
|
clearPayload(): WebEditorOperationResult<WebEditorPayloadSnapshot>;
|
|
31
36
|
getContextDiff(): WebEditorOperationResult<ContextDiffView>;
|
|
37
|
+
readCapabilityState?(): CapabilityStateResult;
|
|
38
|
+
readCapabilityChoices?(): CapabilityAvailableResult;
|
|
39
|
+
mutateCapabilityState?(input: unknown): CapabilityStateResult;
|
|
40
|
+
enableCapability?(input: unknown): CapabilityStateResult;
|
|
32
41
|
}
|
|
33
42
|
export declare function createWebEditorHost(ctx: ExtensionContext, runtime: WebHostRuntime): WebEditorHost;
|
|
34
43
|
export declare function stackSummary(loaded: LoadedPromptStack, active: LoadedPromptStack | undefined): WebEditorStackSummary;
|
package/dist/web-host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-host.d.ts","sourceRoot":"","sources":["../src/web-host.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web-host.d.ts","sourceRoot":"","sources":["../src/web-host.ts"],"names":[],"mappings":"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"}
|
package/dist/web-host.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { parsePromptStack, serializePromptStack } from "./codecs/prompt-stack.js";
|
|
2
|
+
import { capabilityOperation } from "./capability-web-host.js";
|
|
3
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
4
|
import { closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
5
|
import { basename, dirname, join } from "node:path";
|
|
4
6
|
import { agentProfilePath, agentProfilesDir, isResolvedAgentProfileUsable, validateAgentProfile, validateAgentProfilePromptStackScope, } from "./agent-profile.js";
|
|
@@ -10,9 +12,99 @@ import { formatResourceKey, parseResourceSelector } from "./resource-identity.js
|
|
|
10
12
|
import { getRegisteredSlots } from "./slot-renderers.js";
|
|
11
13
|
import { resolveResourceSelector } from "./catalog.js";
|
|
12
14
|
import { createAgentProfilePreview, deleteAgentProfile, getAgentProfileRuntimeStatus, writeAgentProfile, } from "./profile-service.js";
|
|
15
|
+
import { isCapabilityStateMutation, isCapabilityEnableRequest, } from "./capability-state.js";
|
|
13
16
|
export function createWebEditorHost(ctx, runtime) {
|
|
14
17
|
return {
|
|
15
18
|
cwd: ctx.cwd,
|
|
19
|
+
capabilityOperation: (action, selector, input) => capabilityOperation(ctx, runtime, action, selector, input),
|
|
20
|
+
isProjectTrusted: () => ctx.isProjectTrusted(),
|
|
21
|
+
readCapabilityState: () => {
|
|
22
|
+
if (!runtime.readCapabilityState) {
|
|
23
|
+
return { ok: false, status: 503, error: "Capability runtime is unavailable." };
|
|
24
|
+
}
|
|
25
|
+
return runtime.readCapabilityState();
|
|
26
|
+
},
|
|
27
|
+
previewCapabilities: () => {
|
|
28
|
+
if (!runtime.readCapabilityState) {
|
|
29
|
+
return { ok: false, status: 503, error: "Capability runtime is unavailable." };
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const initial = runtime.readCapabilityState();
|
|
33
|
+
if (!initial.ok)
|
|
34
|
+
return initial;
|
|
35
|
+
if (!initial.state.trusted)
|
|
36
|
+
return { ok: false, status: 403, error: "Project is not trusted." };
|
|
37
|
+
if (initial.state.restoring)
|
|
38
|
+
return { ok: false, status: 503, error: "Capability session is restoring." };
|
|
39
|
+
if (!capabilityGuardMatchesContext(ctx, initial.state.guard)) {
|
|
40
|
+
return { ok: false, status: 409, error: "Session or branch changed. Refresh and review." };
|
|
41
|
+
}
|
|
42
|
+
const target = runtime.getActive();
|
|
43
|
+
if (!target)
|
|
44
|
+
return { ok: false, status: 409, error: "No active preset is selected for capability preview." };
|
|
45
|
+
const built = runtime.buildPreview(target);
|
|
46
|
+
const final = runtime.readCapabilityState();
|
|
47
|
+
if (!final.ok)
|
|
48
|
+
return final;
|
|
49
|
+
if (!sameCapabilityGuard(initial.state.guard, final.state.guard)
|
|
50
|
+
|| initial.state.presetRevision !== final.state.presetRevision
|
|
51
|
+
|| !capabilityGuardMatchesContext(ctx, final.state.guard)
|
|
52
|
+
|| runtime.getActive() !== target) {
|
|
53
|
+
return { ok: false, status: 409, error: "Session, branch, capability state, or active preset changed during preview. Refresh and review." };
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
ok: true,
|
|
57
|
+
state: final.state,
|
|
58
|
+
preset: {
|
|
59
|
+
selector: formatResourceKey(target.key),
|
|
60
|
+
...(target.stack.name === undefined ? {} : { name: target.stack.name }),
|
|
61
|
+
},
|
|
62
|
+
text: built.text,
|
|
63
|
+
preview: built.preview,
|
|
64
|
+
diagnostics: built.diagnostics,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return { ok: false, status: 503, error: `Capability preview unavailable: ${error instanceof Error ? error.message : String(error)}` };
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
readCapabilityChoices: () => {
|
|
72
|
+
if (!runtime.readCapabilityChoices) {
|
|
73
|
+
return { ok: false, status: 503, error: "Capability runtime is unavailable." };
|
|
74
|
+
}
|
|
75
|
+
return runtime.readCapabilityChoices();
|
|
76
|
+
},
|
|
77
|
+
mutateCapabilityState: (input) => {
|
|
78
|
+
try {
|
|
79
|
+
if (!ctx.isProjectTrusted()) {
|
|
80
|
+
return { ok: false, status: 403, error: "Project is not trusted; refusing to mutate capabilities." };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return { ok: false, status: 503, error: "Capability session is unavailable." };
|
|
85
|
+
}
|
|
86
|
+
if (!runtime.mutateCapabilityState) {
|
|
87
|
+
return { ok: false, status: 503, error: "Capability runtime is unavailable." };
|
|
88
|
+
}
|
|
89
|
+
if (!isCapabilityStateMutation(input)) {
|
|
90
|
+
return { ok: false, status: 400, error: "Invalid capability state mutation payload." };
|
|
91
|
+
}
|
|
92
|
+
return runtime.mutateCapabilityState(input);
|
|
93
|
+
},
|
|
94
|
+
enableCapability: (input) => {
|
|
95
|
+
try {
|
|
96
|
+
if (!ctx.isProjectTrusted())
|
|
97
|
+
return { ok: false, status: 403, error: "Project is not trusted; refusing to activate capabilities." };
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return { ok: false, status: 503, error: "Capability session is unavailable." };
|
|
101
|
+
}
|
|
102
|
+
if (!runtime.enableCapability)
|
|
103
|
+
return { ok: false, status: 503, error: "Capability runtime is unavailable." };
|
|
104
|
+
if (!isCapabilityEnableRequest(input))
|
|
105
|
+
return { ok: false, status: 400, error: "Invalid capability activation payload." };
|
|
106
|
+
return runtime.enableCapability(input);
|
|
107
|
+
},
|
|
16
108
|
getEditorConfig: () => ({ locale: loadWebEditorSettings(ctx).locale ?? "auto" }),
|
|
17
109
|
setEditorLocale: (locale) => saveWebEditorLocale(ctx, locale),
|
|
18
110
|
listStacks: () => stackSummaries(runtime.getStacks(), runtime.getActive()),
|
|
@@ -29,10 +121,18 @@ export function createWebEditorHost(ctx, runtime) {
|
|
|
29
121
|
listResources: () => editorResources(runtime.getPolicyResources()),
|
|
30
122
|
getStack: (selector) => {
|
|
31
123
|
const loaded = resolveStack(runtime, selector);
|
|
32
|
-
|
|
124
|
+
if (!loaded)
|
|
125
|
+
return undefined;
|
|
126
|
+
// The revision and editable definition must describe the SAME bytes,
|
|
127
|
+
// not cached authorization paired with a newly-read hash.
|
|
128
|
+
const source = readFileSync(loaded.filePath);
|
|
129
|
+
const fresh = parsePromptStack(source.toString("utf8"), loaded.filePath, loaded.scope);
|
|
130
|
+
return { stack: fresh.stack, filePath: loaded.filePath, diagnostics: fresh.diagnostics,
|
|
131
|
+
selector: formatResourceKey(loaded.key), scope: loaded.scope,
|
|
132
|
+
sourceRevision: createHash("sha256").update(source).digest("hex") };
|
|
33
133
|
},
|
|
34
134
|
createStack: (stack, options) => createStackFile(ctx, runtime, stack, options),
|
|
35
|
-
saveStack: (id, stack) => saveStackFile(ctx, runtime, id, stack),
|
|
135
|
+
saveStack: (id, stack, expectedSourceRevision) => saveStackFile(ctx, runtime, id, stack, expectedSourceRevision),
|
|
36
136
|
deleteStack: (id) => deleteStackFile(ctx, runtime, id),
|
|
37
137
|
validateStack: (stack) => validatePromptStack(stack),
|
|
38
138
|
previewStack: (id, stack) => {
|
|
@@ -48,12 +148,19 @@ export function createWebEditorHost(ctx, runtime) {
|
|
|
48
148
|
clearPayload: () => runtime.clearPayload(),
|
|
49
149
|
getContextDiff: () => runtime.getContextDiff(),
|
|
50
150
|
activateStack: (selector) => {
|
|
51
|
-
if (!runtime.setActive(selector))
|
|
52
|
-
|
|
151
|
+
if (!runtime.setActive(selector)) {
|
|
152
|
+
const error = runtime.lastActivationError?.() ?? `Unknown preset: ${selector}`;
|
|
153
|
+
const status = !ctx.isProjectTrusted() ? 403 : resolveStack(runtime, selector) ? 409 : 404;
|
|
154
|
+
return { ok: false, status, error };
|
|
155
|
+
}
|
|
53
156
|
return { ok: true, activeId: runtime.getActiveId(), stacks: stackSummaries(runtime.getStacks(), runtime.getActive()) };
|
|
54
157
|
},
|
|
55
158
|
disableStacks: () => {
|
|
56
|
-
runtime.setActive("none")
|
|
159
|
+
if (!runtime.setActive("none")) {
|
|
160
|
+
const error = runtime.lastActivationError?.() ?? "Failed to disable preset";
|
|
161
|
+
const status = !ctx.isProjectTrusted() ? 403 : 409;
|
|
162
|
+
return { ok: false, status, error };
|
|
163
|
+
}
|
|
57
164
|
return { ok: true, activeId: runtime.getActiveId(), stacks: stackSummaries(runtime.getStacks(), runtime.getActive()) };
|
|
58
165
|
},
|
|
59
166
|
reloadStacks: async () => {
|
|
@@ -307,6 +414,13 @@ function profileWriteError(id, result) {
|
|
|
307
414
|
function modelKey(provider, id) {
|
|
308
415
|
return `${provider}\0${id}`;
|
|
309
416
|
}
|
|
417
|
+
function sameCapabilityGuard(a, b) {
|
|
418
|
+
return a.sessionId === b.sessionId && a.leafId === b.leafId && a.revision === b.revision;
|
|
419
|
+
}
|
|
420
|
+
function capabilityGuardMatchesContext(ctx, guard) {
|
|
421
|
+
return ctx.sessionManager.getSessionId() === guard.sessionId
|
|
422
|
+
&& ctx.sessionManager.getLeafId() === guard.leafId;
|
|
423
|
+
}
|
|
310
424
|
function resolveStack(runtime, selector) {
|
|
311
425
|
const parsed = parseResourceSelector(selector);
|
|
312
426
|
if (!parsed.ok)
|
|
@@ -436,7 +550,23 @@ function writeTextFileAtomically(filePath, content) {
|
|
|
436
550
|
throw error;
|
|
437
551
|
}
|
|
438
552
|
}
|
|
439
|
-
|
|
553
|
+
/** Saving the active resource changes live policy just like selecting it. */
|
|
554
|
+
function activePresetWriteConflict(runtime, target, stack) {
|
|
555
|
+
const active = runtime.getActive();
|
|
556
|
+
if (!active || formatResourceKey(active.key) !== formatResourceKey(target.key))
|
|
557
|
+
return undefined;
|
|
558
|
+
try {
|
|
559
|
+
// Validate the same normalized policy that reload will consume, but keep
|
|
560
|
+
// the original authored object for the existing lossless write path.
|
|
561
|
+
const prospective = parsePromptStack(serializePromptStack(stack), target.filePath, target.scope);
|
|
562
|
+
const error = runtime.validatePresetSwitch?.(prospective);
|
|
563
|
+
return error ? `Cannot save active preset "${stack.id}": ${error} Disable conflicting capabilities before saving.` : undefined;
|
|
564
|
+
}
|
|
565
|
+
catch (error) {
|
|
566
|
+
return error instanceof Error ? error.message : String(error);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
async function saveStackFile(ctx, runtime, id, stack, expectedSourceRevision) {
|
|
440
570
|
if (!ctx.isProjectTrusted()) {
|
|
441
571
|
return { ok: false, status: 403, error: "Project is not trusted; refusing to save presets." };
|
|
442
572
|
}
|
|
@@ -449,24 +579,62 @@ async function saveStackFile(ctx, runtime, id, stack) {
|
|
|
449
579
|
if (stack.id !== target.stack.id) {
|
|
450
580
|
return { ok: false, status: 400, error: "Preset id is immutable during save; fork the preset to create a new id." };
|
|
451
581
|
}
|
|
582
|
+
// Binding-bearing stacks use a stale-view check because their authorization
|
|
583
|
+
// can be revoked outside this editor. Keep the check immediately adjacent to
|
|
584
|
+
// the synchronous write; this is deliberately not a cross-process CAS.
|
|
585
|
+
if (hasRejectedLegacyPromptStackKey(stack)) {
|
|
586
|
+
return { ok: false, status: 400, error: rejectedLegacyPromptStackMessage() };
|
|
587
|
+
}
|
|
588
|
+
let diskHasBindings = false;
|
|
589
|
+
try {
|
|
590
|
+
const diskStack = JSON.parse(readFileSync(target.filePath, "utf8"));
|
|
591
|
+
if (hasRejectedLegacyPromptStackKey(diskStack)) {
|
|
592
|
+
return { ok: false, status: 409, error: rejectedLegacyPromptStackMessage() };
|
|
593
|
+
}
|
|
594
|
+
diskHasBindings = isPlainObject(diskStack) && diskStack.capabilities !== undefined;
|
|
595
|
+
}
|
|
596
|
+
catch {
|
|
597
|
+
return { ok: false, status: 409, error: "Preset source unavailable or malformed; reload before saving." };
|
|
598
|
+
}
|
|
599
|
+
const requiresSourceRevision = diskHasBindings || target.stack.capabilities !== undefined || stack.capabilities !== undefined;
|
|
600
|
+
if (expectedSourceRevision !== undefined || requiresSourceRevision) {
|
|
601
|
+
let currentSourceRevision;
|
|
602
|
+
try {
|
|
603
|
+
currentSourceRevision = promptStackSourceRevision(target.filePath);
|
|
604
|
+
}
|
|
605
|
+
catch {
|
|
606
|
+
return { ok: false, status: 409, error: "Preset source changed and could not be verified; reload before saving." };
|
|
607
|
+
}
|
|
608
|
+
if (expectedSourceRevision === undefined || expectedSourceRevision !== currentSourceRevision) {
|
|
609
|
+
return { ok: false, status: 409, error: "Preset source changed; reload before saving to avoid overwriting capability bindings." };
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
const policyConflict = activePresetWriteConflict(runtime, target, stack);
|
|
613
|
+
if (policyConflict)
|
|
614
|
+
return { ok: false, status: 409, error: policyConflict };
|
|
452
615
|
const write = writePromptStackFile(ctx.cwd, target.scope, target.filePath, stack, { overwrite: true });
|
|
453
616
|
if (!write.ok) {
|
|
454
617
|
// With overwrite: true the repository can fail on containment (403) or I/O (500).
|
|
455
618
|
const status = stackMutationStatus(write.reason);
|
|
456
619
|
return { ok: false, status, error: write.error };
|
|
457
620
|
}
|
|
621
|
+
// Receipt for precisely this write, not a later read after the asynchronous reload.
|
|
622
|
+
const sourceRevision = createHash("sha256").update(serializePromptStack(stack)).digest("hex");
|
|
458
623
|
const preferredId = runtime.getActive() === target ? formatResourceKey(target.key) : runtime.getSelectedActiveId();
|
|
459
624
|
await runtime.reloadStacks(preferredId);
|
|
460
625
|
const saved = runtime.getStacks().find((candidate) => candidate.scope === target.scope && candidate.stack.id === target.stack.id)
|
|
461
626
|
?? runtime.getStacks().find((candidate) => candidate.filePath === target.filePath);
|
|
462
627
|
if (!saved)
|
|
463
628
|
return { ok: false, status: 500, error: "Saved preset could not be reloaded." };
|
|
464
|
-
return { ok: true, stack: stackSummary(saved, runtime.getActive()), stacks: stackSummaries(runtime.getStacks(), runtime.getActive()) };
|
|
629
|
+
return { ok: true, stack: stackSummary(saved, runtime.getActive()), stacks: stackSummaries(runtime.getStacks(), runtime.getActive()), sourceRevision };
|
|
465
630
|
}
|
|
466
631
|
async function createStackFile(ctx, runtime, stack, options) {
|
|
467
632
|
if (!ctx.isProjectTrusted()) {
|
|
468
633
|
return { ok: false, status: 403, error: "Project is not trusted; refusing to create presets." };
|
|
469
634
|
}
|
|
635
|
+
if (hasRejectedLegacyPromptStackKey(stack)) {
|
|
636
|
+
return { ok: false, status: 400, error: rejectedLegacyPromptStackMessage() };
|
|
637
|
+
}
|
|
470
638
|
const idError = validateWebStackId(stack.id);
|
|
471
639
|
if (idError)
|
|
472
640
|
return { ok: false, status: 400, error: idError };
|
|
@@ -478,6 +646,23 @@ async function createStackFile(ctx, runtime, stack, options) {
|
|
|
478
646
|
const targetPath = existingById && options.overwrite
|
|
479
647
|
? existingById.filePath
|
|
480
648
|
: promptStackTargetPath(ctx.cwd, scope, stack.id);
|
|
649
|
+
// Check the current raw source, not cached diagnostics: normalization intentionally
|
|
650
|
+
// omits rejected legacy fields, and external edits may postdate the catalog.
|
|
651
|
+
if (options.overwrite && existsSync(targetPath)) {
|
|
652
|
+
try {
|
|
653
|
+
if (hasRejectedLegacyPromptStackKey(JSON.parse(readFileSync(targetPath, "utf8")))) {
|
|
654
|
+
return { ok: false, status: 409, error: rejectedLegacyPromptStackMessage() };
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
catch {
|
|
658
|
+
return { ok: false, status: 409, error: "Preset source unavailable or malformed; reload before overwriting." };
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
if (existingById && options.overwrite) {
|
|
662
|
+
const policyConflict = activePresetWriteConflict(runtime, existingById, stack);
|
|
663
|
+
if (policyConflict)
|
|
664
|
+
return { ok: false, status: 409, error: policyConflict };
|
|
665
|
+
}
|
|
481
666
|
const write = writePromptStackFile(ctx.cwd, scope, targetPath, stack, { overwrite: options.overwrite ?? false });
|
|
482
667
|
if (!write.ok) {
|
|
483
668
|
const status = stackMutationStatus(write.reason);
|
|
@@ -485,9 +670,14 @@ async function createStackFile(ctx, runtime, stack, options) {
|
|
|
485
670
|
}
|
|
486
671
|
const previousSelection = runtime.getSelectedActiveId();
|
|
487
672
|
const createdSelector = formatResourceKey({ scope, id: stack.id });
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
673
|
+
// Discover the new file without selecting it before activation preflight.
|
|
674
|
+
await runtime.reloadStacks(previousSelection ?? "none");
|
|
675
|
+
if (options.activate) {
|
|
676
|
+
if (!runtime.setActive(createdSelector)) {
|
|
677
|
+
const error = `Preset "${createdSelector}" was created, but activation failed: ${runtime.lastActivationError?.() ?? "Could not activate created preset."}`;
|
|
678
|
+
return { ok: false, status: 409, error };
|
|
679
|
+
}
|
|
680
|
+
}
|
|
491
681
|
const created = runtime.getStacks().find((candidate) => candidate.scope === scope && candidate.filePath === targetPath);
|
|
492
682
|
if (!created)
|
|
493
683
|
return { ok: false, status: 500, error: "Created preset could not be reloaded." };
|
|
@@ -528,6 +718,9 @@ export function stackMutationStatus(reason) {
|
|
|
528
718
|
return 500;
|
|
529
719
|
}
|
|
530
720
|
}
|
|
721
|
+
function promptStackSourceRevision(filePath) {
|
|
722
|
+
return createHash("sha256").update(readFileSync(filePath)).digest("hex");
|
|
723
|
+
}
|
|
531
724
|
function validateWebStackId(id) {
|
|
532
725
|
if (!id.trim())
|
|
533
726
|
return "Preset id must not be empty.";
|
|
@@ -536,6 +729,12 @@ function validateWebStackId(id) {
|
|
|
536
729
|
}
|
|
537
730
|
return undefined;
|
|
538
731
|
}
|
|
732
|
+
function hasRejectedLegacyPromptStackKey(value) {
|
|
733
|
+
return isPlainObject(value) && Object.prototype.hasOwnProperty.call(value, "instructionModes");
|
|
734
|
+
}
|
|
735
|
+
function rejectedLegacyPromptStackMessage() {
|
|
736
|
+
return 'Preset key "instructionModes" is no longer supported; convert it to "capabilities" before saving.';
|
|
737
|
+
}
|
|
539
738
|
function isPlainObject(value) {
|
|
540
739
|
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
541
740
|
}
|