@zihanw/pi-forge 0.5.3 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/README.md +67 -103
  3. package/README.zh-CN.md +67 -95
  4. package/assets/pi-forge-header-concept-1.png +0 -0
  5. package/assets/readme/PROVENANCE.md +95 -0
  6. package/assets/readme/en/capability-tools.gif +0 -0
  7. package/assets/readme/en/context-composition.gif +0 -0
  8. package/assets/readme/en/context-toggle.gif +0 -0
  9. package/assets/readme/en/draft-diff.png +0 -0
  10. package/assets/readme/en/edit-draft-diff.gif +0 -0
  11. package/assets/readme/en/editor-overview-v3.png +0 -0
  12. package/assets/readme/en/editor-overview.png +0 -0
  13. package/assets/readme/en/mode-tools.gif +0 -0
  14. package/assets/readme/en/regex-transforms.gif +0 -0
  15. package/assets/readme/en/tool-selection.gif +0 -0
  16. package/assets/readme/tui-quickstart.gif +0 -0
  17. package/assets/readme/zh-CN/capability-tools.gif +0 -0
  18. package/assets/readme/zh-CN/context-composition.gif +0 -0
  19. package/assets/readme/zh-CN/context-toggle.gif +0 -0
  20. package/assets/readme/zh-CN/draft-diff.png +0 -0
  21. package/assets/readme/zh-CN/edit-draft-diff.gif +0 -0
  22. package/assets/readme/zh-CN/editor-overview-v3.png +0 -0
  23. package/assets/readme/zh-CN/editor-overview.png +0 -0
  24. package/assets/readme/zh-CN/mode-tools.gif +0 -0
  25. package/assets/readme/zh-CN/regex-transforms.gif +0 -0
  26. package/assets/readme/zh-CN/tool-selection.gif +0 -0
  27. package/dist/active-state.d.ts +148 -0
  28. package/dist/active-state.d.ts.map +1 -0
  29. package/dist/active-state.js +374 -0
  30. package/dist/active-state.js.map +1 -0
  31. package/dist/agent-profile.d.ts.map +1 -1
  32. package/dist/agent-profile.js +11 -0
  33. package/dist/agent-profile.js.map +1 -1
  34. package/dist/capabilities.d.ts +39 -0
  35. package/dist/capabilities.d.ts.map +1 -0
  36. package/dist/capabilities.js +160 -0
  37. package/dist/capabilities.js.map +1 -0
  38. package/dist/capability-anchors.d.ts +45 -0
  39. package/dist/capability-anchors.d.ts.map +1 -0
  40. package/dist/capability-anchors.js +263 -0
  41. package/dist/capability-anchors.js.map +1 -0
  42. package/dist/capability-command.d.ts +4 -0
  43. package/dist/capability-command.d.ts.map +1 -0
  44. package/dist/capability-command.js +164 -0
  45. package/dist/capability-command.js.map +1 -0
  46. package/dist/capability-events.d.ts +79 -0
  47. package/dist/capability-events.d.ts.map +1 -0
  48. package/dist/capability-events.js +478 -0
  49. package/dist/capability-events.js.map +1 -0
  50. package/dist/capability-projection.d.ts +22 -0
  51. package/dist/capability-projection.d.ts.map +1 -0
  52. package/dist/capability-projection.js +273 -0
  53. package/dist/capability-projection.js.map +1 -0
  54. package/dist/capability-protocol.d.ts +21 -0
  55. package/dist/capability-protocol.d.ts.map +1 -0
  56. package/dist/capability-protocol.js +15 -0
  57. package/dist/capability-protocol.js.map +1 -0
  58. package/dist/capability-state.d.ts +74 -0
  59. package/dist/capability-state.d.ts.map +1 -0
  60. package/dist/capability-state.js +43 -0
  61. package/dist/capability-state.js.map +1 -0
  62. package/dist/capability-tool.d.ts +11 -0
  63. package/dist/capability-tool.d.ts.map +1 -0
  64. package/dist/capability-tool.js +25 -0
  65. package/dist/capability-tool.js.map +1 -0
  66. package/dist/capability-web-host.d.ts +11 -0
  67. package/dist/capability-web-host.d.ts.map +1 -0
  68. package/dist/capability-web-host.js +105 -0
  69. package/dist/capability-web-host.js.map +1 -0
  70. package/dist/codecs/capability.d.ts +71 -0
  71. package/dist/codecs/capability.d.ts.map +1 -0
  72. package/dist/codecs/capability.js +363 -0
  73. package/dist/codecs/capability.js.map +1 -0
  74. package/dist/codecs/prompt-stack.d.ts +1 -1
  75. package/dist/codecs/prompt-stack.d.ts.map +1 -1
  76. package/dist/codecs/prompt-stack.js +140 -13
  77. package/dist/codecs/prompt-stack.js.map +1 -1
  78. package/dist/command-contribution/index.d.ts +21 -0
  79. package/dist/command-contribution/index.d.ts.map +1 -0
  80. package/dist/command-contribution/index.js +14 -0
  81. package/dist/command-contribution/index.js.map +1 -0
  82. package/dist/compile-cycle.d.ts +7 -1
  83. package/dist/compile-cycle.d.ts.map +1 -1
  84. package/dist/compile-cycle.js +2 -0
  85. package/dist/compile-cycle.js.map +1 -1
  86. package/dist/compiler.d.ts +7 -1
  87. package/dist/compiler.d.ts.map +1 -1
  88. package/dist/compiler.js +140 -19
  89. package/dist/compiler.js.map +1 -1
  90. package/dist/context-diff-history.d.ts +2 -0
  91. package/dist/context-diff-history.d.ts.map +1 -1
  92. package/dist/context-diff-history.js +9 -0
  93. package/dist/context-diff-history.js.map +1 -1
  94. package/dist/forge-command.d.ts +10 -0
  95. package/dist/forge-command.d.ts.map +1 -0
  96. package/dist/forge-command.js +106 -0
  97. package/dist/forge-command.js.map +1 -0
  98. package/dist/index.d.ts +2 -2
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +58 -7
  101. package/dist/index.js.map +1 -1
  102. package/dist/json-fingerprint.d.ts +11 -0
  103. package/dist/json-fingerprint.d.ts.map +1 -0
  104. package/dist/json-fingerprint.js +66 -0
  105. package/dist/json-fingerprint.js.map +1 -0
  106. package/dist/lifecycle.d.ts +14 -0
  107. package/dist/lifecycle.d.ts.map +1 -1
  108. package/dist/lifecycle.js +175 -66
  109. package/dist/lifecycle.js.map +1 -1
  110. package/dist/payload-command.d.ts +2 -2
  111. package/dist/payload-command.d.ts.map +1 -1
  112. package/dist/payload-command.js +80 -26
  113. package/dist/payload-command.js.map +1 -1
  114. package/dist/payload-state.d.ts +1 -0
  115. package/dist/payload-state.d.ts.map +1 -1
  116. package/dist/payload-state.js +1 -0
  117. package/dist/payload-state.js.map +1 -1
  118. package/dist/policy.d.ts +2 -1
  119. package/dist/policy.d.ts.map +1 -1
  120. package/dist/policy.js +3 -0
  121. package/dist/policy.js.map +1 -1
  122. package/dist/preset-command.d.ts +2 -0
  123. package/dist/preset-command.d.ts.map +1 -1
  124. package/dist/preset-command.js +101 -36
  125. package/dist/preset-command.js.map +1 -1
  126. package/dist/preview-text.d.ts +5 -0
  127. package/dist/preview-text.d.ts.map +1 -0
  128. package/dist/preview-text.js +27 -0
  129. package/dist/preview-text.js.map +1 -0
  130. package/dist/preview.d.ts +18 -1
  131. package/dist/preview.d.ts.map +1 -1
  132. package/dist/preview.js +134 -99
  133. package/dist/preview.js.map +1 -1
  134. package/dist/profile-command.d.ts +4 -1
  135. package/dist/profile-command.d.ts.map +1 -1
  136. package/dist/profile-command.js +77 -14
  137. package/dist/profile-command.js.map +1 -1
  138. package/dist/prompt-cache-warning.d.ts +23 -0
  139. package/dist/prompt-cache-warning.d.ts.map +1 -0
  140. package/dist/prompt-cache-warning.js +74 -0
  141. package/dist/prompt-cache-warning.js.map +1 -0
  142. package/dist/regex.d.ts.map +1 -1
  143. package/dist/regex.js +5 -0
  144. package/dist/regex.js.map +1 -1
  145. package/dist/render-helpers.d.ts.map +1 -1
  146. package/dist/render-helpers.js +2 -0
  147. package/dist/render-helpers.js.map +1 -1
  148. package/dist/repositories/capability.d.ts +53 -0
  149. package/dist/repositories/capability.d.ts.map +1 -0
  150. package/dist/repositories/capability.js +294 -0
  151. package/dist/repositories/capability.js.map +1 -0
  152. package/dist/runtime/capability-runtime.d.ts +91 -0
  153. package/dist/runtime/capability-runtime.d.ts.map +1 -0
  154. package/dist/runtime/capability-runtime.js +967 -0
  155. package/dist/runtime/capability-runtime.js.map +1 -0
  156. package/dist/runtime/tool-policy-runtime.d.ts +8 -0
  157. package/dist/runtime/tool-policy-runtime.d.ts.map +1 -1
  158. package/dist/runtime/tool-policy-runtime.js +171 -30
  159. package/dist/runtime/tool-policy-runtime.js.map +1 -1
  160. package/dist/session-adapter.d.ts +13 -0
  161. package/dist/session-adapter.d.ts.map +1 -1
  162. package/dist/session-adapter.js +110 -0
  163. package/dist/session-adapter.js.map +1 -1
  164. package/dist/session-usage.d.ts +65 -0
  165. package/dist/session-usage.d.ts.map +1 -0
  166. package/dist/session-usage.js +134 -0
  167. package/dist/session-usage.js.map +1 -0
  168. package/dist/subagent/fingerprints.d.ts +3 -15
  169. package/dist/subagent/fingerprints.d.ts.map +1 -1
  170. package/dist/subagent/fingerprints.js +5 -69
  171. package/dist/subagent/fingerprints.js.map +1 -1
  172. package/dist/subagent/index.d.ts +2 -0
  173. package/dist/subagent/index.d.ts.map +1 -1
  174. package/dist/subagent/index.js +2 -0
  175. package/dist/subagent/index.js.map +1 -1
  176. package/dist/subagent-host.d.ts +2 -2
  177. package/dist/subagent-host.d.ts.map +1 -1
  178. package/dist/subagent-host.js +13 -1
  179. package/dist/subagent-host.js.map +1 -1
  180. package/dist/types.d.ts +6 -1
  181. package/dist/types.d.ts.map +1 -1
  182. package/dist/types.js.map +1 -1
  183. package/dist/web-editor/client-script.generated.d.ts.map +1 -1
  184. package/dist/web-editor/client-script.generated.js +1 -1
  185. package/dist/web-editor/client-script.generated.js.map +1 -1
  186. package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
  187. package/dist/web-editor/client-styles.generated.js +1 -1
  188. package/dist/web-editor/client-styles.generated.js.map +1 -1
  189. package/dist/web-editor/server.d.ts.map +1 -1
  190. package/dist/web-editor/server.js +152 -4
  191. package/dist/web-editor/server.js.map +1 -1
  192. package/dist/web-editor/styles.d.ts.map +1 -1
  193. package/dist/web-editor/styles.js +521 -116
  194. package/dist/web-editor/styles.js.map +1 -1
  195. package/dist/web-editor/types.d.ts +81 -1
  196. package/dist/web-editor/types.d.ts.map +1 -1
  197. package/dist/web-host.d.ts +7 -0
  198. package/dist/web-host.d.ts.map +1 -1
  199. package/dist/web-host.js +168 -5
  200. package/dist/web-host.js.map +1 -1
  201. package/dist/workspace.d.ts +11 -0
  202. package/dist/workspace.d.ts.map +1 -1
  203. package/dist/workspace.js +63 -5
  204. package/dist/workspace.js.map +1 -1
  205. package/docs/README.md +4 -0
  206. package/docs/design/README.md +3 -1
  207. package/docs/design/architecture-0.5.md +22 -0
  208. package/docs/design/archive/2026-09-12-system-update-design.md +229 -0
  209. package/docs/design/pi-forge-system-update-design-notes.md +157 -0
  210. package/docs/development/release.md +20 -20
  211. package/docs/development/roadmap.md +17 -2
  212. package/docs/development/scoped-global-profiles-stacks.md +1 -1
  213. package/docs/development/setup.md +1 -1
  214. package/docs/getting-started.md +1 -1
  215. package/docs/guides/delegation.md +22 -20
  216. package/docs/guides/migrating-to-0.5.md +29 -0
  217. package/docs/guides/use-cases.md +6 -2
  218. package/docs/guides/web-editor.md +73 -5
  219. package/docs/reference/active-state.md +77 -0
  220. package/docs/reference/capabilities.md +259 -0
  221. package/docs/reference/commands.md +52 -24
  222. package/docs/reference/configuration.md +4 -2
  223. package/docs/reference/features.md +70 -4
  224. package/docs/reference/provider-support.md +67 -0
  225. package/docs/reference/public-api.md +49 -3
  226. package/docs/reference/session-cache.md +112 -0
  227. package/docs/reference/stack-schema.md +18 -4
  228. package/docs/reference/subagent-host-port.md +8 -0
  229. package/docs/zh-CN/README.md +3 -0
  230. package/docs/zh-CN/getting-started.md +1 -1
  231. package/docs/zh-CN/guides/delegation.md +22 -10
  232. package/docs/zh-CN/guides/migrating-to-0.5.md +29 -0
  233. package/docs/zh-CN/guides/web-editor.md +74 -7
  234. package/docs/zh-CN/reference/capabilities.md +259 -0
  235. package/docs/zh-CN/reference/commands.md +61 -33
  236. package/docs/zh-CN/reference/provider-support.md +67 -0
  237. package/docs/zh-CN/reference/session-cache.md +112 -0
  238. package/examples/capabilities/review.json +12 -0
  239. package/examples/capabilities/write-tools.json +15 -0
  240. package/examples/read-first-worker-prompt-stack.json +49 -0
  241. package/package.json +16 -9
@@ -0,0 +1,294 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
3
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
+ import { createCapabilityFault, isUsableCapability, parseCapability, serializeCapability, } from "../codecs/capability.js";
5
+ import { isValidResourceId } from "../resource-identity.js";
6
+ import { globalForgeDir } from "../storage.js";
7
+ export const MAX_CAPABILITY_SOURCE_SIZE = 1024 * 1024; // 1 MiB
8
+ export function globalCapabilitiesDir() {
9
+ return join(globalForgeDir(), "capabilities");
10
+ }
11
+ export function capabilitiesDir(cwd) {
12
+ return join(cwd, ".pi", "forge", "capabilities");
13
+ }
14
+ /**
15
+ * Read global capabilities.
16
+ * Returns empty array if directory does not exist (ENOENT).
17
+ * Throws on real directory read errors (e.g. permission denied) to fail closed.
18
+ */
19
+ export function readGlobalCapabilities(globalDir = globalCapabilitiesDir()) {
20
+ const capabilities = loadCapabilitiesFromDir(globalDir, "global");
21
+ annotateDuplicateCapabilityIds(capabilities);
22
+ return capabilities;
23
+ }
24
+ /**
25
+ * Read scoped capabilities (global and project).
26
+ * Returns empty array for missing directory (ENOENT); throws on real directory read errors.
27
+ * Preserves faults for shadowed resolution and attaches errors to same-scope duplicate IDs.
28
+ */
29
+ export function readCapabilitiesScoped(cwd, globalDir = globalCapabilitiesDir()) {
30
+ const capabilities = [
31
+ ...loadCapabilitiesFromDir(globalDir, "global"),
32
+ ...loadCapabilitiesFromDir(capabilitiesDir(cwd), "project"),
33
+ ];
34
+ annotateDuplicateCapabilityIds(capabilities);
35
+ return capabilities;
36
+ }
37
+ /**
38
+ * Read a single capability file.
39
+ * Returns a LoadedCapability fault if reading or parsing fails, or if file exceeds 1MiB.
40
+ */
41
+ export function readSingleCapabilityFile(filePath, scope = "project") {
42
+ let source;
43
+ let sourceRevision;
44
+ try {
45
+ const stat = statSync(filePath);
46
+ if (stat.size > MAX_CAPABILITY_SOURCE_SIZE) {
47
+ return createCapabilityFault(filePath, scope, `Capability capability file size (${stat.size} bytes) exceeds 1MiB limit.`);
48
+ }
49
+ const buf = readFileSync(filePath);
50
+ if (buf.byteLength > MAX_CAPABILITY_SOURCE_SIZE) {
51
+ return createCapabilityFault(filePath, scope, `Capability capability file size (${buf.byteLength} bytes) exceeds 1MiB limit.`);
52
+ }
53
+ source = buf.toString("utf8");
54
+ sourceRevision = createHash("sha256").update(buf).digest("hex");
55
+ }
56
+ catch (error) {
57
+ return createCapabilityFault(filePath, scope, `Failed to read capability: ${error instanceof Error ? error.message : String(error)}`);
58
+ }
59
+ return { ...parseCapability(source, filePath, scope), sourceRevision };
60
+ }
61
+ function loadCapabilitiesFromDir(dir, scope) {
62
+ let entries;
63
+ try {
64
+ entries = readdirSync(dir, { withFileTypes: true });
65
+ }
66
+ catch (error) {
67
+ const err = error;
68
+ if (err && (err.code === "ENOENT" || (typeof err.message === "string" && err.message.includes("ENOENT")))) {
69
+ return [];
70
+ }
71
+ throw error instanceof Error ? error : new Error(String(error));
72
+ }
73
+ const fileNames = [];
74
+ for (const entry of entries) {
75
+ if (!entry.name.endsWith(".json") || entry.name.startsWith("."))
76
+ continue;
77
+ if (entry.isDirectory())
78
+ continue;
79
+ if (entry.isSymbolicLink()) {
80
+ try {
81
+ if (!statSync(join(dir, entry.name)).isFile())
82
+ continue;
83
+ }
84
+ catch {
85
+ // Retain broken symlinks so read will record a fault
86
+ }
87
+ }
88
+ else if (!entry.isFile()) {
89
+ continue;
90
+ }
91
+ fileNames.push(entry.name);
92
+ }
93
+ fileNames.sort();
94
+ return fileNames.map((name) => readSingleCapabilityFile(join(dir, name), scope));
95
+ }
96
+ function annotateDuplicateCapabilityIds(capabilities) {
97
+ const byScopeId = new Map();
98
+ for (const loaded of capabilities) {
99
+ const key = `${loaded.scope}\0${loaded.capability.id}`;
100
+ const matches = byScopeId.get(key) ?? [];
101
+ matches.push(loaded);
102
+ byScopeId.set(key, matches);
103
+ }
104
+ for (const matches of byScopeId.values()) {
105
+ if (matches.length <= 1)
106
+ continue;
107
+ const files = matches.map((loaded) => basename(loaded.filePath)).join(", ");
108
+ for (const loaded of matches) {
109
+ loaded.diagnostics.push({
110
+ level: "error",
111
+ message: `Duplicate ${loaded.scope} capability id: "${loaded.capability.id}" appears in multiple files (${files}).`,
112
+ });
113
+ }
114
+ }
115
+ }
116
+ /**
117
+ * Compute the sha256 revision hash of raw capability file bytes.
118
+ * Throws ENOENT if missing or an Error if size exceeds 1MiB limit.
119
+ */
120
+ export function capabilityRevision(filePath) {
121
+ const stat = statSync(filePath);
122
+ if (!stat.isFile()) {
123
+ throw new Error(`Expected a regular file at ${filePath}`);
124
+ }
125
+ if (stat.size > MAX_CAPABILITY_SOURCE_SIZE) {
126
+ throw new Error(`Capability capability file size (${stat.size} bytes) exceeds 1MiB limit.`);
127
+ }
128
+ const buf = readFileSync(filePath);
129
+ if (buf.byteLength > MAX_CAPABILITY_SOURCE_SIZE) {
130
+ throw new Error(`Capability capability file size (${buf.byteLength} bytes) exceeds 1MiB limit.`);
131
+ }
132
+ return createHash("sha256").update(buf).digest("hex");
133
+ }
134
+ function pathTraversesNoSymlink(anchor, target) {
135
+ const resolvedAnchor = resolve(anchor);
136
+ const resolvedTarget = resolve(target);
137
+ const rel = relative(resolvedAnchor, resolvedTarget);
138
+ if (rel.startsWith("..") || isAbsolute(rel))
139
+ return false;
140
+ try {
141
+ if (lstatSync(resolvedAnchor).isSymbolicLink())
142
+ return false;
143
+ }
144
+ catch (error) {
145
+ if (error.code !== "ENOENT")
146
+ return false;
147
+ // anchor does not exist yet
148
+ }
149
+ let current = resolvedAnchor;
150
+ for (const segment of rel.split(sep)) {
151
+ if (!segment || segment === ".")
152
+ continue;
153
+ current = join(current, segment);
154
+ try {
155
+ if (lstatSync(current).isSymbolicLink())
156
+ return false;
157
+ }
158
+ catch (error) {
159
+ if (error.code !== "ENOENT")
160
+ return false;
161
+ // segment does not exist yet
162
+ }
163
+ }
164
+ return true;
165
+ }
166
+ function verifyCapabilityPath(cwd, scope, filePath, expectedId) {
167
+ if (scope !== "project" && scope !== "global") {
168
+ return { ok: false, reason: "invalid-path", error: `Invalid scope: ${String(scope)}` };
169
+ }
170
+ if (!filePath || typeof filePath !== "string") {
171
+ return { ok: false, reason: "invalid-path", error: "File path is required." };
172
+ }
173
+ const rootDir = resolve(scope === "global" ? globalCapabilitiesDir() : capabilitiesDir(cwd));
174
+ const anchor = resolve(scope === "global" ? globalForgeDir() : cwd);
175
+ const resolvedTarget = resolve(filePath);
176
+ if (dirname(resolvedTarget) !== rootDir) {
177
+ return { ok: false, reason: "invalid-path", error: `Path is outside ${scope} root (${rootDir}): ${filePath}` };
178
+ }
179
+ const fileName = basename(resolvedTarget);
180
+ if (!fileName.endsWith(".json") || fileName.startsWith(".")) {
181
+ return { ok: false, reason: "invalid-path", error: `File must be a non-hidden .json file: ${fileName}` };
182
+ }
183
+ const id = basename(fileName, ".json");
184
+ if (!isValidResourceId(id) || (expectedId !== undefined && expectedId !== id)) {
185
+ return { ok: false, reason: "invalid-path", error: `Invalid ID or rename mismatch: ${fileName}` };
186
+ }
187
+ if (!pathTraversesNoSymlink(anchor, resolvedTarget)) {
188
+ return { ok: false, reason: "invalid-path", error: `Path traverses or targets a symlink: ${filePath}` };
189
+ }
190
+ try {
191
+ if (lstatSync(resolvedTarget).isDirectory()) {
192
+ return { ok: false, reason: "invalid-path", error: `Path is a directory: ${filePath}` };
193
+ }
194
+ }
195
+ catch {
196
+ // Target does not exist yet
197
+ }
198
+ return { ok: true, rootDir, fileName };
199
+ }
200
+ function checkExpectedRevision(filePath, expected) {
201
+ if (!expected)
202
+ return { ok: false, reason: "conflict", error: "expectedSourceRevision is required." };
203
+ if (!existsSync(filePath))
204
+ return { ok: false, reason: "conflict", error: `File does not exist: ${filePath}` };
205
+ try {
206
+ const current = capabilityRevision(filePath);
207
+ if (current !== expected) {
208
+ return { ok: false, reason: "conflict", error: `Revision conflict: expected ${expected}, got ${current}.` };
209
+ }
210
+ }
211
+ catch (err) {
212
+ if (err?.code === "ENOENT")
213
+ return { ok: false, reason: "conflict", error: `File does not exist: ${filePath}` };
214
+ return { ok: false, reason: "io-error", error: `Failed to read revision: ${err instanceof Error ? err.message : String(err)}` };
215
+ }
216
+ return null;
217
+ }
218
+ /**
219
+ * Write a capability file.
220
+ * Creates exclusively with "wx" when overwrite is false.
221
+ * Updates atomically with expectedSourceRevision check when overwrite is true.
222
+ */
223
+ export function writeCapabilityFile(cwd, scope, filePath, capability, options) {
224
+ const pathCheck = verifyCapabilityPath(cwd, scope, filePath, capability?.id);
225
+ if (!pathCheck.ok)
226
+ return pathCheck;
227
+ let serialized;
228
+ try {
229
+ serialized = serializeCapability(capability);
230
+ }
231
+ catch (error) {
232
+ return { ok: false, reason: "invalid-capability", error: `Failed to serialize capability: ${error instanceof Error ? error.message : String(error)}` };
233
+ }
234
+ if (Buffer.byteLength(serialized, "utf8") > MAX_CAPABILITY_SOURCE_SIZE) {
235
+ return { ok: false, reason: "invalid-capability", error: "Capability capability file size exceeds 1MiB limit." };
236
+ }
237
+ const parsed = parseCapability(serialized, filePath, scope);
238
+ if (!isUsableCapability(parsed)) {
239
+ const msg = parsed.diagnostics.filter((d) => d.level === "error").map((d) => d.message).join("; ");
240
+ return { ok: false, reason: "invalid-capability", error: msg || "Invalid capability." };
241
+ }
242
+ const { rootDir, fileName } = pathCheck;
243
+ if (!options.overwrite) {
244
+ if (existsSync(filePath))
245
+ return { ok: false, reason: "conflict", error: `Capability capability already exists: ${filePath}` };
246
+ try {
247
+ mkdirSync(rootDir, { recursive: true });
248
+ writeFileSync(filePath, serialized, { encoding: "utf8", flag: "wx" });
249
+ return { ok: true };
250
+ }
251
+ catch (error) {
252
+ if (error?.code === "EEXIST")
253
+ return { ok: false, reason: "conflict", error: `Capability capability already exists: ${filePath}` };
254
+ return { ok: false, reason: "io-error", error: `Failed to write capability: ${error instanceof Error ? error.message : String(error)}` };
255
+ }
256
+ }
257
+ const revConflict = checkExpectedRevision(filePath, options.expectedSourceRevision);
258
+ if (revConflict)
259
+ return revConflict;
260
+ const tempPath = join(rootDir, `.${fileName}.${randomUUID()}.tmp`);
261
+ try {
262
+ mkdirSync(rootDir, { recursive: true });
263
+ writeFileSync(tempPath, serialized, "utf8");
264
+ renameSync(tempPath, filePath);
265
+ return { ok: true };
266
+ }
267
+ catch (error) {
268
+ try {
269
+ if (existsSync(tempPath))
270
+ unlinkSync(tempPath);
271
+ }
272
+ catch { }
273
+ return { ok: false, reason: "io-error", error: `Failed to write capability: ${error instanceof Error ? error.message : String(error)}` };
274
+ }
275
+ }
276
+ /**
277
+ * Delete a capability file with expectedSourceRevision check.
278
+ */
279
+ export function deleteCapabilityFile(cwd, scope, filePath, options) {
280
+ const pathCheck = verifyCapabilityPath(cwd, scope, filePath);
281
+ if (!pathCheck.ok)
282
+ return pathCheck;
283
+ const revConflict = checkExpectedRevision(filePath, options?.expectedSourceRevision);
284
+ if (revConflict)
285
+ return revConflict;
286
+ try {
287
+ unlinkSync(filePath);
288
+ return { ok: true };
289
+ }
290
+ catch (error) {
291
+ return { ok: false, reason: "io-error", error: `Failed to delete capability: ${error instanceof Error ? error.message : String(error)}` };
292
+ }
293
+ }
294
+ //# sourceMappingURL=capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/repositories/capability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { type CapabilityAvailableResult, type CapabilityStateGuard, type CapabilityStateResult } from "../capability-state.ts";
2
+ import type { AgentMessage } from "@earendil-works/pi-agent-core";
3
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
4
+ import { type ResolvedCapabilityBinding } from "../capabilities.ts";
5
+ import { type ResourceKey } from "../resource-identity.ts";
6
+ import type { ForgeWorkspace } from "../workspace.ts";
7
+ import type { ToolPolicyRuntime } from "./tool-policy-runtime.ts";
8
+ export type ReadBindingsResult = {
9
+ ok: true;
10
+ preset: ResourceKey | null;
11
+ bindings: readonly ResolvedCapabilityBinding[];
12
+ } | {
13
+ ok: false;
14
+ error: string;
15
+ };
16
+ export type EnableBoundResult = {
17
+ ok: true;
18
+ activationId: string;
19
+ idempotent?: boolean;
20
+ message: string;
21
+ } | {
22
+ ok: false;
23
+ error: string;
24
+ };
25
+ export type DisableBoundResult = {
26
+ ok: true;
27
+ activationId: string;
28
+ message: string;
29
+ } | {
30
+ ok: false;
31
+ error: string;
32
+ };
33
+ export interface CapabilityCompletionCapability {
34
+ id: string;
35
+ bareId: string;
36
+ label: string;
37
+ collides: boolean;
38
+ }
39
+ export interface CapabilityCompletionBinding {
40
+ id: string;
41
+ label: string;
42
+ modelCallable: boolean;
43
+ }
44
+ export interface CapabilityCompletionActivation {
45
+ id: string;
46
+ label: string;
47
+ }
48
+ export type CapabilityCompletionViewResult = {
49
+ ok: true;
50
+ trusted: boolean;
51
+ capturedAt: string;
52
+ capabilities: readonly CapabilityCompletionCapability[];
53
+ bindings: readonly CapabilityCompletionBinding[];
54
+ active: readonly CapabilityCompletionActivation[];
55
+ } | {
56
+ ok: false;
57
+ error: string;
58
+ };
59
+ /** Branch entries are authoritative. This service only coordinates the existing tool owner and delivery. */
60
+ export declare function createCapabilityRuntime(pi: ExtensionAPI, workspace: ForgeWorkspace, tools: ToolPolicyRuntime): {
61
+ prepareRestore: (ctx: ExtensionContext) => void;
62
+ restore: (ctx: ExtensionContext, options?: {
63
+ deferToolPolicy?: boolean;
64
+ }) => void;
65
+ sync: (ctx?: ExtensionContext | undefined) => void;
66
+ prepareMessages: (raw: AgentMessage[], ctx: ExtensionContext) => AgentMessage[];
67
+ project: (messages: AgentMessage[], ctx: ExtensionContext) => AgentMessage[];
68
+ commitEndAnchors: (ctx: ExtensionContext) => void;
69
+ setAgentBusy: (busy: boolean) => void;
70
+ library: (ctx: ExtensionContext) => string;
71
+ completionView: (ctx?: ExtensionContext) => CapabilityCompletionViewResult;
72
+ status: (ctx: ExtensionContext, includeRuleContent?: boolean) => string;
73
+ change: (ctx: ExtensionContext, command: "add" | "enable" | "enable-bound" | "disable" | "reset", value: string, expectedFingerprint?: string, expectedGuard?: CapabilityStateGuard) => string;
74
+ readBindings: (ctx: ExtensionContext) => ReadBindingsResult;
75
+ enableBound: (ctx: ExtensionContext, id: string, actor?: "user" | "agent", expectedFingerprint?: string, expectedGuard?: CapabilityStateGuard) => EnableBoundResult;
76
+ disableBound: (ctx: ExtensionContext, id: string, actor?: "user" | "agent") => DisableBoundResult;
77
+ executeAgentTool: (ctx: ExtensionContext, params: unknown) => Promise<{
78
+ content: Array<{
79
+ type: "text";
80
+ text: string;
81
+ }>;
82
+ details: unknown;
83
+ }>;
84
+ readState: () => CapabilityStateResult;
85
+ mutateState: (input: unknown) => CapabilityStateResult;
86
+ readAvailableCapabilities: () => CapabilityAvailableResult;
87
+ enableCapability: (input: unknown) => CapabilityStateResult;
88
+ dispose: () => void;
89
+ };
90
+ export type CapabilityRuntime = ReturnType<typeof createCapabilityRuntime>;
91
+ //# sourceMappingURL=capability-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/capability-runtime.ts"],"names":[],"mappings":"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"}