@zihanw/pi-forge 0.4.0-beta.1 → 0.4.1

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 (227) hide show
  1. package/CHANGELOG.md +45 -1
  2. package/PUBLIC_API.md +3 -26
  3. package/README.md +90 -601
  4. package/README.zh-CN.md +86 -585
  5. package/SUBAGENT_ADAPTER_CONTRACT.md +3 -197
  6. package/dist/agent-profile.d.ts +24 -1
  7. package/dist/agent-profile.d.ts.map +1 -1
  8. package/dist/agent-profile.js +146 -36
  9. package/dist/agent-profile.js.map +1 -1
  10. package/dist/catalog.d.ts +27 -0
  11. package/dist/catalog.d.ts.map +1 -0
  12. package/dist/catalog.js +59 -0
  13. package/dist/catalog.js.map +1 -0
  14. package/dist/forge-config.d.ts +106 -0
  15. package/dist/forge-config.d.ts.map +1 -1
  16. package/dist/forge-config.js +305 -18
  17. package/dist/forge-config.js.map +1 -1
  18. package/dist/index.d.ts +5 -5
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +55 -8
  21. package/dist/index.js.map +1 -1
  22. package/dist/lifecycle.d.ts +2 -1
  23. package/dist/lifecycle.d.ts.map +1 -1
  24. package/dist/lifecycle.js +7 -4
  25. package/dist/lifecycle.js.map +1 -1
  26. package/dist/loader.d.ts +17 -1
  27. package/dist/loader.d.ts.map +1 -1
  28. package/dist/loader.js +84 -25
  29. package/dist/loader.js.map +1 -1
  30. package/dist/preset-command.d.ts +1 -1
  31. package/dist/preset-command.d.ts.map +1 -1
  32. package/dist/preset-command.js +38 -10
  33. package/dist/preset-command.js.map +1 -1
  34. package/dist/profile-command.d.ts.map +1 -1
  35. package/dist/profile-command.js +46 -21
  36. package/dist/profile-command.js.map +1 -1
  37. package/dist/profile-service.d.ts +6 -3
  38. package/dist/profile-service.d.ts.map +1 -1
  39. package/dist/profile-service.js +55 -13
  40. package/dist/profile-service.js.map +1 -1
  41. package/dist/resource-identity.d.ts +33 -0
  42. package/dist/resource-identity.d.ts.map +1 -0
  43. package/dist/resource-identity.js +56 -0
  44. package/dist/resource-identity.js.map +1 -0
  45. package/dist/runtime/profile-runtime.d.ts.map +1 -1
  46. package/dist/runtime/profile-runtime.js +7 -2
  47. package/dist/runtime/profile-runtime.js.map +1 -1
  48. package/dist/runtime/prompt-stack-runtime.d.ts +1 -1
  49. package/dist/runtime/prompt-stack-runtime.d.ts.map +1 -1
  50. package/dist/runtime/prompt-stack-runtime.js +22 -12
  51. package/dist/runtime/prompt-stack-runtime.js.map +1 -1
  52. package/dist/runtime/subagent-runtime.d.ts +23 -8
  53. package/dist/runtime/subagent-runtime.d.ts.map +1 -1
  54. package/dist/runtime/subagent-runtime.js +296 -67
  55. package/dist/runtime/subagent-runtime.js.map +1 -1
  56. package/dist/storage.d.ts +11 -0
  57. package/dist/storage.d.ts.map +1 -1
  58. package/dist/storage.js +51 -2
  59. package/dist/storage.js.map +1 -1
  60. package/dist/subagent/canonical.d.ts +19 -7
  61. package/dist/subagent/canonical.d.ts.map +1 -1
  62. package/dist/subagent/canonical.js +19 -47
  63. package/dist/subagent/canonical.js.map +1 -1
  64. package/dist/subagent/contract.d.ts +1 -2
  65. package/dist/subagent/contract.d.ts.map +1 -1
  66. package/dist/subagent/contract.js +1 -2
  67. package/dist/subagent/contract.js.map +1 -1
  68. package/dist/subagent/index.d.ts +4 -3
  69. package/dist/subagent/index.d.ts.map +1 -1
  70. package/dist/subagent/index.js +4 -3
  71. package/dist/subagent/index.js.map +1 -1
  72. package/dist/subagent/plan.d.ts +5 -1
  73. package/dist/subagent/plan.d.ts.map +1 -1
  74. package/dist/subagent/plan.js +29 -32
  75. package/dist/subagent/plan.js.map +1 -1
  76. package/dist/subagent/request.d.ts.map +1 -1
  77. package/dist/subagent/request.js +36 -4
  78. package/dist/subagent/request.js.map +1 -1
  79. package/dist/subagent/types.d.ts +66 -178
  80. package/dist/subagent/types.d.ts.map +1 -1
  81. package/dist/subagent/types.js +1 -1
  82. package/dist/subagent/types.js.map +1 -1
  83. package/dist/subagent/validation.d.ts +14 -14
  84. package/dist/subagent/validation.d.ts.map +1 -1
  85. package/dist/subagent/validation.js +52 -238
  86. package/dist/subagent/validation.js.map +1 -1
  87. package/dist/subagent-command.d.ts +2 -1
  88. package/dist/subagent-command.d.ts.map +1 -1
  89. package/dist/subagent-command.js +115 -19
  90. package/dist/subagent-command.js.map +1 -1
  91. package/dist/subagent-host.d.ts.map +1 -1
  92. package/dist/subagent-host.js +43 -16
  93. package/dist/subagent-host.js.map +1 -1
  94. package/dist/subagent-profile-tool.d.ts +25 -2
  95. package/dist/subagent-profile-tool.d.ts.map +1 -1
  96. package/dist/subagent-profile-tool.js +41 -9
  97. package/dist/subagent-profile-tool.js.map +1 -1
  98. package/dist/subagent-tool.d.ts +31 -4
  99. package/dist/subagent-tool.d.ts.map +1 -1
  100. package/dist/subagent-tool.js +311 -137
  101. package/dist/subagent-tool.js.map +1 -1
  102. package/dist/types.d.ts +3 -0
  103. package/dist/types.d.ts.map +1 -1
  104. package/dist/types.js.map +1 -1
  105. package/dist/web-editor/client-script.generated.d.ts +1 -1
  106. package/dist/web-editor/client-script.generated.d.ts.map +1 -1
  107. package/dist/web-editor/client-script.generated.js +1 -1
  108. package/dist/web-editor/client-script.generated.js.map +1 -1
  109. package/dist/web-editor/client-styles.d.ts +2 -0
  110. package/dist/web-editor/client-styles.d.ts.map +1 -0
  111. package/dist/web-editor/client-styles.generated.d.ts +2 -0
  112. package/dist/web-editor/client-styles.generated.d.ts.map +1 -0
  113. package/dist/web-editor/client-styles.generated.js +3 -0
  114. package/dist/web-editor/client-styles.generated.js.map +1 -0
  115. package/dist/web-editor/client-styles.js +2 -0
  116. package/dist/web-editor/client-styles.js.map +1 -0
  117. package/dist/web-editor/page.d.ts +2 -0
  118. package/dist/web-editor/page.d.ts.map +1 -1
  119. package/dist/web-editor/page.js +11 -73
  120. package/dist/web-editor/page.js.map +1 -1
  121. package/dist/web-editor/server.d.ts.map +1 -1
  122. package/dist/web-editor/server.js +176 -1
  123. package/dist/web-editor/server.js.map +1 -1
  124. package/dist/web-editor/styles.d.ts.map +1 -1
  125. package/dist/web-editor/styles.js +60 -3
  126. package/dist/web-editor/styles.js.map +1 -1
  127. package/dist/web-editor/types.d.ts +87 -0
  128. package/dist/web-editor/types.d.ts.map +1 -1
  129. package/dist/web-host.d.ts +13 -2
  130. package/dist/web-host.d.ts.map +1 -1
  131. package/dist/web-host.js +371 -27
  132. package/dist/web-host.js.map +1 -1
  133. package/docs/README.md +41 -0
  134. package/docs/concepts/agent-profiles.md +60 -0
  135. package/docs/concepts/prompt-stacks.md +95 -0
  136. package/docs/design/README.md +17 -0
  137. package/docs/design/roadmap-0.4-archive.md +216 -0
  138. package/docs/design/subagents/design-review.md +220 -0
  139. package/docs/design/subagents/interface-design.md +274 -0
  140. package/docs/design/subagents/sdk-spike-findings.md +117 -0
  141. package/docs/development/complexity-review.md +86 -0
  142. package/docs/development/release.md +31 -0
  143. package/docs/development/roadmap.md +36 -0
  144. package/docs/development/scoped-global-profiles-stacks.md +325 -0
  145. package/docs/development/setup.md +75 -0
  146. package/docs/getting-started.md +95 -0
  147. package/docs/guides/custom-macros-and-slots.md +68 -0
  148. package/docs/guides/debugging.md +39 -0
  149. package/docs/guides/delegation.md +107 -0
  150. package/docs/guides/sillytavern-import.md +47 -0
  151. package/docs/guides/use-cases.md +65 -0
  152. package/docs/guides/web-editor.md +75 -0
  153. package/docs/reference/commands.md +60 -0
  154. package/docs/reference/configuration.md +66 -0
  155. package/docs/reference/features.md +280 -0
  156. package/docs/reference/macros-and-slots.md +82 -0
  157. package/docs/reference/public-api.md +28 -0
  158. package/docs/reference/stack-schema.md +167 -0
  159. package/docs/reference/subagent-adapter.md +204 -0
  160. package/docs/zh-CN/README.md +37 -0
  161. package/docs/zh-CN/concepts/agent-profiles.md +46 -0
  162. package/docs/zh-CN/concepts/prompt-stacks.md +42 -0
  163. package/docs/zh-CN/getting-started.md +81 -0
  164. package/docs/zh-CN/guides/delegation.md +66 -0
  165. package/docs/zh-CN/guides/web-editor.md +45 -0
  166. package/docs/zh-CN/reference/commands.md +60 -0
  167. package/package.json +29 -15
  168. package/dist/subagent/backend-registry.d.ts +0 -75
  169. package/dist/subagent/backend-registry.d.ts.map +0 -1
  170. package/dist/subagent/backend-registry.js +0 -463
  171. package/dist/subagent/backend-registry.js.map +0 -1
  172. package/dist/subagent/diagnostics.d.ts +0 -3
  173. package/dist/subagent/diagnostics.d.ts.map +0 -1
  174. package/dist/subagent/diagnostics.js +0 -5
  175. package/dist/subagent/diagnostics.js.map +0 -1
  176. package/dist/subagent/pi-model-runtime.d.ts +0 -8
  177. package/dist/subagent/pi-model-runtime.d.ts.map +0 -1
  178. package/dist/subagent/pi-model-runtime.js +0 -22
  179. package/dist/subagent/pi-model-runtime.js.map +0 -1
  180. package/dist/subagent/pi-sdk-backend.d.ts +0 -23
  181. package/dist/subagent/pi-sdk-backend.d.ts.map +0 -1
  182. package/dist/subagent/pi-sdk-backend.js +0 -383
  183. package/dist/subagent/pi-sdk-backend.js.map +0 -1
  184. package/dist/subagent/pi-subprocess-backend.d.ts +0 -72
  185. package/dist/subagent/pi-subprocess-backend.d.ts.map +0 -1
  186. package/dist/subagent/pi-subprocess-backend.js +0 -756
  187. package/dist/subagent/pi-subprocess-backend.js.map +0 -1
  188. package/dist/subagent/subprocess-bridge.d.ts +0 -21
  189. package/dist/subagent/subprocess-bridge.d.ts.map +0 -1
  190. package/dist/subagent/subprocess-bridge.js +0 -87
  191. package/dist/subagent/subprocess-bridge.js.map +0 -1
  192. package/dist/subagent/subprocess-report.d.ts +0 -4
  193. package/dist/subagent/subprocess-report.d.ts.map +0 -1
  194. package/dist/subagent/subprocess-report.js +0 -55
  195. package/dist/subagent/subprocess-report.js.map +0 -1
  196. package/dist/subagent-contract.d.ts +0 -8
  197. package/dist/subagent-contract.d.ts.map +0 -1
  198. package/dist/subagent-contract.js +0 -8
  199. package/dist/subagent-contract.js.map +0 -1
  200. package/dist/web-editor/client/api.d.ts +0 -9
  201. package/dist/web-editor/client/api.d.ts.map +0 -1
  202. package/dist/web-editor/client/api.js +0 -26
  203. package/dist/web-editor/client/api.js.map +0 -1
  204. package/dist/web-editor/client/dom.d.ts +0 -13
  205. package/dist/web-editor/client/dom.d.ts.map +0 -1
  206. package/dist/web-editor/client/dom.js +0 -30
  207. package/dist/web-editor/client/dom.js.map +0 -1
  208. package/dist/web-editor/client/inspector.d.ts +0 -22
  209. package/dist/web-editor/client/inspector.d.ts.map +0 -1
  210. package/dist/web-editor/client/inspector.js +0 -226
  211. package/dist/web-editor/client/inspector.js.map +0 -1
  212. package/dist/web-editor/client/main.d.ts +0 -2
  213. package/dist/web-editor/client/main.d.ts.map +0 -1
  214. package/dist/web-editor/client/main.js +0 -1468
  215. package/dist/web-editor/client/main.js.map +0 -1
  216. package/dist/web-editor/client/policy-editor.d.ts +0 -16
  217. package/dist/web-editor/client/policy-editor.d.ts.map +0 -1
  218. package/dist/web-editor/client/policy-editor.js +0 -330
  219. package/dist/web-editor/client/policy-editor.js.map +0 -1
  220. package/dist/web-editor/client/regex-editor.d.ts +0 -19
  221. package/dist/web-editor/client/regex-editor.d.ts.map +0 -1
  222. package/dist/web-editor/client/regex-editor.js +0 -281
  223. package/dist/web-editor/client/regex-editor.js.map +0 -1
  224. package/dist/web-editor/client/types.d.ts +0 -60
  225. package/dist/web-editor/client/types.d.ts.map +0 -1
  226. package/dist/web-editor/client/types.js +0 -2
  227. package/dist/web-editor/client/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-tool.js","sourceRoot":"","sources":["../src/subagent-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagent-tool.js","sourceRoot":"","sources":["../src/subagent-tool.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
2
  import type { BuildSystemPromptOptions, ExtensionContext } from "@earendil-works/pi-coding-agent";
3
+ import type { ResourceKey, ResourceScope } from "./resource-identity.ts";
3
4
  export type PromptStackMode = "replace" | "append" | "prepend";
4
5
  export type PromptStackRole = "system" | "user" | "assistant" | "custom";
5
6
  export type PromptStackSlot = "chat-history" | "tools" | "tool-guidelines" | "skills" | "project-context" | "append-system-prompt" | "date" | "cwd" | "date-cwd" | "active-model" | "pi-docs" | "variables";
@@ -130,6 +131,8 @@ export interface PromptStack {
130
131
  export interface LoadedPromptStack {
131
132
  stack: PromptStack;
132
133
  filePath: string;
134
+ scope: ResourceScope;
135
+ key: ResourceKey;
133
136
  diagnostics: PromptStackDiagnostic[];
134
137
  }
135
138
  export type PromptStackDiagnosticLevel = "error" | "warning" | "info";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAgNA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAmNA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const EDITOR_CLIENT_SCRIPT = "\"use strict\";\n(() => {\n // src/web-editor/client/api.ts\n var EditorApiError = class extends Error {\n constructor(message, status) {\n super(message);\n this.status = status;\n this.name = \"EditorApiError\";\n }\n status;\n };\n function createEditorApi(token2) {\n return async function api2(path, options = {}) {\n const headers = new Headers(options.headers);\n headers.set(\"x-pi-forge-token\", token2);\n let body = options.body;\n if (body && typeof body === \"object\" && !(body instanceof Blob) && !(body instanceof FormData) && !(body instanceof URLSearchParams)) {\n headers.set(\"content-type\", \"application/json\");\n body = JSON.stringify(body);\n }\n const response = await fetch(path, { ...options, headers, body });\n const text = await response.text();\n const data = text ? JSON.parse(text) : {};\n if (!response.ok) throw new EditorApiError(data.error || response.statusText, response.status);\n return data;\n };\n }\n\n // src/web-editor/client/dom.ts\n function el(id) {\n const element = document.getElementById(id);\n if (!element) throw new Error(`Editor element #${id} is missing.`);\n return element;\n }\n function query(root, selector) {\n return root.querySelector(selector);\n }\n function queryAll(root, selector) {\n return root.querySelectorAll(selector);\n }\n function escapeHtml(value) {\n return String(value ?? \"\").replace(/[&<>\"']/g, (character) => ({\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#039;\"\n })[character]);\n }\n function attr(value) {\n return escapeHtml(value).replace(/`/g, \"&#096;\");\n }\n\n // src/web-editor/client/inspector.ts\n function createInspector(deps) {\n const { api: api2, stackForSubmit: stackForSubmit2, renderDiagnostics: renderDiagnostics2, renderItemList: renderItemList2, setStatus: setStatus2 } = deps;\n const selectedId2 = deps.getSelectedId;\n let payloadSnapshot = { status: \"idle\" };\n let previewCopyTexts = [];\n async function validateStack2() {\n const stack = stackForSubmit2();\n const data = await api2(\"/api/stacks/\" + encodeURIComponent(selectedId2()) + \"/validate\", { method: \"POST\", body: { stack } });\n renderDiagnostics2(data.diagnostics || []);\n renderItemList2();\n hidePreview2();\n setStatus2(\"Validation complete\", \"success\");\n }\n async function previewStack2() {\n const stack = stackForSubmit2();\n const data = await api2(\"/api/stacks/\" + encodeURIComponent(selectedId2()) + \"/preview\", { method: \"POST\", body: { stack } });\n renderDiagnostics2(data.diagnostics || []);\n renderItemList2();\n renderPreviewInspector(data);\n setStatus2(\"Preview rendered\", \"success\");\n }\n async function refreshPayloadCapture2(options = {}) {\n const previousCapturedAt = payloadSnapshot.status === \"captured\" ? payloadSnapshot.capture?.capturedAt : \"\";\n const data = await api2(\"/api/payload\");\n payloadSnapshot = data;\n updatePayloadButton();\n const nextCapturedAt = payloadSnapshot.status === \"captured\" ? payloadSnapshot.capture?.capturedAt : \"\";\n if (options.open || options.autoOpen && nextCapturedAt && nextCapturedAt !== previousCapturedAt) {\n renderPayloadInspector(payloadSnapshot);\n }\n }\n async function armPayloadCapture2(showInspector = false) {\n const data = await api2(\"/api/payload/arm\", { method: \"POST\" });\n payloadSnapshot = data;\n updatePayloadButton();\n setStatus2(\"Payload capture armed; send the next Pi prompt\");\n if (showInspector) renderPayloadInspector(payloadSnapshot);\n }\n async function clearPayloadCapture2() {\n const data = await api2(\"/api/payload\", { method: \"DELETE\" });\n payloadSnapshot = data;\n updatePayloadButton();\n hidePreview2();\n setStatus2(\"Payload capture cleared\", \"success\");\n }\n async function openPayloadCapture2() {\n await refreshPayloadCapture2();\n if (payloadSnapshot.status === \"captured\" || payloadSnapshot.status === \"armed\") {\n renderPayloadInspector(payloadSnapshot);\n return;\n }\n await armPayloadCapture2();\n }\n function updatePayloadButton() {\n const button = el(\"payloadBtn\");\n if (!button) return;\n button.classList.remove(\"primary\");\n if (payloadSnapshot.status === \"armed\") {\n button.textContent = \"Payload armed\";\n button.classList.add(\"primary\");\n button.title = \"Waiting for the next provider payload\";\n return;\n }\n if (payloadSnapshot.status === \"captured\") {\n button.textContent = \"View payload\";\n button.title = \"Open the latest captured provider payload\";\n return;\n }\n button.textContent = \"Arm payload\";\n button.title = \"Capture the next provider payload in this editor\";\n }\n function hidePreview2() {\n const pane = el(\"preview\");\n pane.classList.remove(\"open\");\n pane.innerHTML = \"\";\n previewCopyTexts = [];\n }\n function renderPreviewInspector(data) {\n const pane = el(\"preview\");\n const preview = data.preview;\n if (!preview) {\n previewCopyTexts = [data.text || \"\"];\n pane.innerHTML = '<div class=\"preview-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Prompt preview\"><div class=\"preview-head\"><div><div class=\"preview-title\">Preview</div><div class=\"preview-meta\">Plain text fallback</div></div><div class=\"preview-actions\"><button class=\"preview-copy\" data-copy-index=\"0\" data-icon=\"\u25A1\" title=\"Copy the full preview text\">Copy</button><button data-preview-close=\"true\" data-icon=\"\u00D7\" title=\"Close the preview\">Close</button></div></div><div class=\"preview-body\"><pre class=\"preview-text\">' + escapeHtml(data.text || \"\") + \"</pre></div></div>\";\n pane.classList.add(\"open\");\n return;\n }\n const sections = [preview.system, ...preview.messages || []];\n previewCopyTexts = [data.text || \"\", ...sections.map((section) => section.content || \"\")];\n const sectionHtml = sections.map((section, index) => {\n const open = index === 0 ? \" open\" : \"\";\n const label = section.role ? section.role + \" \u00B7 \" : \"\";\n return '<details class=\"preview-section\"' + open + '><summary><span class=\"preview-title\">' + escapeHtml(section.title || section.id) + '</span><span class=\"preview-meta\">' + escapeHtml(label + formatCount(section.chars) + \" chars \u00B7 ~\" + formatCount(section.approxTokens) + \" tokens\") + '</span><button class=\"preview-copy\" data-copy-index=\"' + attr(index + 1) + '\" data-icon=\"\u25A1\" title=\"Copy this preview section\" onclick=\"event.preventDefault()\">Copy</button></summary><pre class=\"preview-text\">' + escapeHtml(section.content || \"\") + \"</pre></details>\";\n }).join(\"\");\n pane.innerHTML = '<div class=\"preview-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Prompt preview\"><div class=\"preview-head\"><div><div class=\"preview-title\">Prompt preview: ' + escapeHtml(preview.stackId || selectedId2()) + '</div><div class=\"preview-meta\">' + escapeHtml(formatCount(preview.totalChars) + \" chars \u00B7 ~\" + formatCount(preview.approxTokens) + \" tokens \u00B7 \" + (preview.messages || []).length + \" messages\") + '</div></div><div class=\"preview-actions\"><button class=\"preview-copy\" data-copy-index=\"0\" data-icon=\"\u25A1\" title=\"Copy the full prompt preview\">Copy full</button><button data-preview-close=\"true\" data-icon=\"\u00D7\" title=\"Close the preview\">Close</button></div></div><div class=\"preview-body\">' + sectionHtml + \"</div></div>\";\n pane.classList.add(\"open\");\n }\n function renderPayloadInspector(snapshot) {\n const pane = el(\"preview\");\n if (snapshot.status === \"idle\") {\n previewCopyTexts = [];\n pane.innerHTML = '<div class=\"preview-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Provider payload capture\"><div class=\"preview-head\"><div><div class=\"preview-title\">Provider payload</div><div class=\"preview-meta\">No payload captured.</div></div><div class=\"preview-actions\"><button data-payload-arm=\"true\" data-icon=\"\u25C6\" title=\"Capture the next provider payload\">Arm next</button><button data-preview-close=\"true\" data-icon=\"\u00D7\" title=\"Close the payload inspector\">Close</button></div></div><div class=\"preview-body\"><div class=\"empty\">Arm capture, then send the next prompt in Pi. The provider payload will appear here before it is sent.</div></div></div>';\n pane.classList.add(\"open\");\n return;\n }\n if (snapshot.status === \"armed\") {\n const meta = snapshot.armedAt ? \"Armed at \" + snapshot.armedAt : \"Waiting for next provider request\";\n previewCopyTexts = [];\n pane.innerHTML = '<div class=\"preview-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Provider payload capture\"><div class=\"preview-head\"><div><div class=\"preview-title\">Payload capture armed</div><div class=\"preview-meta\">' + escapeHtml(meta) + '</div></div><div class=\"preview-actions\"><button class=\"danger\" data-payload-clear=\"true\" data-icon=\"\u00D7\" title=\"Clear the armed payload capture\">Clear</button><button data-preview-close=\"true\" data-icon=\"\u00D7\" title=\"Close the payload inspector\">Close</button></div></div><div class=\"preview-body\"><div class=\"empty\">Send the next prompt in Pi. The exact provider payload will be captured here and redacted before display.</div></div></div>';\n pane.classList.add(\"open\");\n return;\n }\n const capture = snapshot.capture || {};\n const sections = payloadSections(capture);\n previewCopyTexts = [capture.text || \"\", ...sections.map((section) => section.content || \"\")];\n const sectionHtml = sections.map((section, index) => {\n const open = index === 0 ? \" open\" : \"\";\n return '<details class=\"preview-section\"' + open + '><summary><span class=\"preview-title\">' + escapeHtml(section.title) + '</span><span class=\"preview-meta\">' + escapeHtml(section.meta) + '</span><button class=\"preview-copy\" data-copy-index=\"' + attr(index + 1) + '\" data-icon=\"\u25A1\" title=\"Copy this payload section\" onclick=\"event.preventDefault()\">Copy</button></summary><pre class=\"preview-text\">' + escapeHtml(section.content || \"\") + \"</pre></details>\";\n }).join(\"\");\n const metaParts = [\n formatCount(capture.chars) + \" chars\",\n \"~\" + formatCount(capture.approxTokens) + \" tokens\",\n capture.stackId ? \"stack \" + capture.stackId : void 0,\n capture.truncated ? \"truncated\" : void 0\n ].filter(Boolean);\n pane.innerHTML = '<div class=\"preview-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Provider payload capture\"><div class=\"preview-head\"><div><div class=\"preview-title\">Provider payload</div><div class=\"preview-meta\">' + escapeHtml(metaParts.join(\" \u00B7 \") + (capture.capturedAt ? \" \u00B7 \" + capture.capturedAt : \"\")) + '</div></div><div class=\"preview-actions\"><button class=\"preview-copy\" data-copy-index=\"0\" data-icon=\"\u25A1\" title=\"Copy the full redacted payload\">Copy full</button><button data-payload-arm=\"true\" data-icon=\"\u25C6\" title=\"Capture the next provider payload\">Arm again</button><button class=\"danger\" data-payload-clear=\"true\" data-icon=\"\u00D7\" title=\"Clear the captured payload\">Clear</button><button data-preview-close=\"true\" data-icon=\"\u00D7\" title=\"Close the payload inspector\">Close</button></div></div><div class=\"preview-body\">' + sectionHtml + \"</div></div>\";\n pane.classList.add(\"open\");\n }\n function payloadSections(capture) {\n const value = capture.payload;\n if (value && typeof value === \"object\") {\n if (Array.isArray(value)) {\n return value.map((item, index) => payloadSection(String(index), item));\n }\n const entries = Object.entries(value);\n if (entries.length) return entries.map(([key, item]) => payloadSection(key, item));\n }\n return [{\n title: capture.error ? \"Stringify error\" : capture.truncated ? \"Raw truncated payload\" : \"Raw payload\",\n meta: formatCount((capture.text || \"\").length) + \" chars\",\n content: capture.text || \"\"\n }];\n }\n function payloadSection(title, value) {\n const rendered = JSON.stringify(value, null, 2);\n const content = rendered === void 0 ? String(value) : rendered;\n const meta = describePayloadValue(value) + \" \u00B7 \" + formatCount(content.length) + \" chars\";\n return { title, meta, content };\n }\n function describePayloadValue(value) {\n if (Array.isArray(value)) return \"array[\" + value.length + \"]\";\n if (value && typeof value === \"object\") return \"object{\" + Object.keys(value).length + \"}\";\n if (value === null) return \"null\";\n return typeof value;\n }\n function formatCount(value) {\n return Number(value || 0).toLocaleString();\n }\n async function copyPreviewText2(index) {\n const text = previewCopyTexts[index] || \"\";\n if (!text) return;\n await copyTextToClipboard2(text);\n setStatus2(\"Copied text\", \"success\");\n }\n async function copyTextToClipboard2(text) {\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n } else {\n const area = document.createElement(\"textarea\");\n area.value = text;\n area.style.position = \"fixed\";\n area.style.left = \"-9999px\";\n document.body.appendChild(area);\n area.select();\n document.execCommand(\"copy\");\n area.remove();\n }\n }\n return {\n validateStack: validateStack2,\n previewStack: previewStack2,\n refreshPayloadCapture: refreshPayloadCapture2,\n armPayloadCapture: armPayloadCapture2,\n clearPayloadCapture: clearPayloadCapture2,\n openPayloadCapture: openPayloadCapture2,\n hidePreview: hidePreview2,\n copyPreviewText: copyPreviewText2,\n copyTextToClipboard: copyTextToClipboard2\n };\n }\n\n // src/web-editor/client/policy-editor.ts\n function createPolicyEditor(deps) {\n const currentStack2 = () => deps.getStack();\n const policyResources2 = () => deps.getResources();\n const { markDirty: markDirty2, setStatus: setStatus2 } = deps;\n let policyError = \"\";\n function renderPolicyTab() {\n if (!currentStack2()) return;\n el(\"tabPanel\").innerHTML = '<div class=\"tab-section\"><div class=\"tab-section-title\">Tool policy and skill visibility</div><div class=\"tab-section-meta\">Tool rules constrain active tools. Skill rules only filter model-visible skills rendered by pi-forge; they do not block explicit skill invocation. Patterns support exact names and * wildcards.</div><div class=\"data-table\" id=\"policyRows\"><div class=\"data-row header policy-row\"><div>Resource</div><div>Mode</div><div>Patterns</div><div>Available</div><div>Status</div></div>' + policyRowHtml(\"tools\", \"Tools\") + policyRowHtml(\"skills\", \"Skills\") + \"</div></div>\";\n bindPolicyEditor();\n }\n function policyRowHtml(kind, label) {\n const policy = stackPolicyObject(kind);\n const mode = policyMode(policy);\n const rawPatterns = mode === \"deny\" ? policy.deny : mode === \"allow\" ? policy.allow : [];\n const patterns = Array.isArray(rawPatterns) ? rawPatterns : [];\n const patternText = policyPatternsToText(patterns);\n const disabled = mode === \"none\" ? \" disabled\" : \"\";\n return '<div class=\"data-row policy-row\" data-policy-row data-policy-kind=\"' + attr(kind) + '\" data-policy-mode=\"' + attr(mode) + '\"><div><div class=\"policy-title\">' + escapeHtml(label) + '</div><div class=\"modal-meta\">' + escapeHtml(kind) + '</div></div><div class=\"field\"><label>Mode</label><div class=\"segmented policy-mode\">' + policyModeButton(\"none\", \"Unrestricted\", mode) + policyModeButton(\"allow\", \"Allow\", mode) + policyModeButton(\"deny\", \"Deny\", mode) + '</div></div><div class=\"field\"><label>Patterns</label>' + selectedPolicyPatternsHtml(patterns) + '<textarea class=\"policy-patterns\" data-policy-patterns spellcheck=\"false\" placeholder=\"' + attr(policyPatternPlaceholder(mode)) + '\"' + disabled + \">\" + escapeHtml(patternText) + \"</textarea></div>\" + resourcePickerHtml(kind, patterns) + '<div class=\"policy-summary\" data-policy-summary>' + escapeHtml(policySummary(kind, policy)) + \"</div></div>\";\n }\n function selectedPolicyPatternsHtml(patterns) {\n return '<div class=\"selected-patterns\" data-selected-patterns>' + selectedPolicyPatternButtonsHtml(patterns) + \"</div>\";\n }\n function selectedPolicyPatternButtonsHtml(patterns) {\n if (!patterns.length) return '<span class=\"selected-pattern-empty\">No selected patterns.</span>';\n return patterns.map(\n (pattern) => '<button type=\"button\" class=\"selected-pattern-chip\" data-remove-policy-pattern=\"' + attr(pattern) + '\" title=\"Remove selected pattern\">' + escapeHtml(pattern) + '<span aria-hidden=\"true\">x</span></button>'\n ).join(\"\");\n }\n function resourcePickerHtml(kind, selectedPatterns = []) {\n const resources = policyResources2()[kind] || [];\n if (!resources.length) {\n return '<div class=\"resource-picker\"><label>Available ' + escapeHtml(kind) + '</label><div class=\"resource-empty\">No registered ' + escapeHtml(kind) + \" reported.</div></div>\";\n }\n const listId = \"resource-options-\" + kind;\n return '<div class=\"resource-picker\"><label>Available ' + escapeHtml(kind) + '</label><div><input class=\"resource-filter\" data-resource-filter list=\"' + attr(listId) + '\" placeholder=\"Type to filter or add\"><datalist id=\"' + attr(listId) + '\" data-resource-options>' + resourceOptionsHtml(kind, selectedPatterns) + '</datalist><div class=\"resource-list\" data-resource-list>' + resourceListHtml(kind, selectedPatterns) + \"</div></div></div>\";\n }\n function resourceOptionsHtml(kind, selectedPatterns = []) {\n return availablePolicyResources(kind, selectedPatterns).map((resource) => '<option value=\"' + attr(resource.name) + '\"></option>').join(\"\");\n }\n function resourceListHtml(kind, selectedPatterns = [], filter = \"\") {\n const resources = availablePolicyResources(kind, selectedPatterns, filter);\n if (!resources.length) return '<div class=\"resource-empty\">No matching unselected ' + escapeHtml(kind) + \".</div>\";\n return resources.map((resource) => resourceChipHtml(resource)).join(\"\");\n }\n function availablePolicyResources(kind, selectedPatterns = [], filter = \"\") {\n const selected = new Set(selectedPatterns);\n const needle = filter.trim().toLowerCase();\n return (policyResources2()[kind] || []).filter((resource) => !selected.has(resource.name)).filter((resource) => !needle || policyResourceMatchesFilter(resource, needle));\n }\n function policyResourceMatchesFilter(resource, needle) {\n return [resource.name, resource.description, resource.source].filter(Boolean).some((value) => String(value).toLowerCase().includes(needle));\n }\n function resourceChipHtml(resource) {\n const classes = [\"resource-chip\"];\n if (resource.active) classes.push(\"active\");\n if (resource.hidden) classes.push(\"hidden\");\n const notes = [\n resource.description,\n resource.source ? \"Source: \" + resource.source : \"\",\n resource.active ? \"Active tool\" : \"\",\n resource.hidden ? \"Hidden from model invocation\" : \"\"\n ].filter(Boolean);\n const suffix = resource.active ? \" *\" : resource.hidden ? \" hidden\" : \"\";\n return '<button type=\"button\" class=\"' + attr(classes.join(\" \")) + '\" data-resource-name=\"' + attr(resource.name) + '\" title=\"' + attr(notes.join(\"\\n\") || resource.name) + '\">' + escapeHtml(resource.name + suffix) + \"</button>\";\n }\n function policyModeButton(value, label, current) {\n return '<button type=\"button\" data-policy-mode-option=\"' + attr(value) + '\" class=\"' + (value === current ? \"active\" : \"\") + '\">' + escapeHtml(label) + \"</button>\";\n }\n function bindPolicyEditor() {\n const rows = el(\"policyRows\");\n rows.onclick = (event) => {\n const modeButton = event.target.closest?.(\"[data-policy-mode-option]\");\n if (modeButton) {\n const row = modeButton.closest(\"[data-policy-row]\");\n setPolicyRowMode(row, modeButton.dataset.policyModeOption);\n if (modeButton.dataset.policyModeOption === \"none\") row.querySelector(\"[data-policy-patterns]\").value = \"\";\n syncResourcePolicyFromTab();\n return;\n }\n const removeButton = event.target.closest?.(\"[data-remove-policy-pattern]\");\n if (removeButton) {\n const row = removeButton.closest(\"[data-policy-row]\");\n removePolicyPattern(row, removeButton.dataset.removePolicyPattern || \"\");\n syncResourcePolicyFromTab();\n return;\n }\n const resourceButton = event.target.closest?.(\"[data-resource-name]\");\n if (resourceButton) {\n const row = resourceButton.closest(\"[data-policy-row]\");\n addPolicyPattern(row, resourceButton.dataset.resourceName || \"\");\n clearPolicyResourceFilter(row);\n syncResourcePolicyFromTab();\n }\n };\n rows.oninput = (event) => {\n const target = event.target;\n if (target.matches?.(\"[data-policy-patterns]\")) {\n syncResourcePolicyFromTab();\n return;\n }\n if (target.matches?.(\"[data-resource-filter]\")) {\n refreshPolicyResourceControls(target.closest(\"[data-policy-row]\"));\n }\n };\n rows.onkeydown = (event) => {\n const target = event.target;\n if (!target.matches?.(\"[data-resource-filter]\") || event.key !== \"Enter\") return;\n event.preventDefault();\n const row = target.closest(\"[data-policy-row]\");\n const name = policyResourceAutocompleteValue(row, target.value);\n if (!name) return;\n addPolicyPattern(row, name);\n target.value = \"\";\n syncResourcePolicyFromTab();\n };\n refreshPolicySummaries();\n refreshPolicyResourceControls();\n }\n function clearPolicyResourceFilter(row) {\n const filter = row?.querySelector(\"[data-resource-filter]\");\n if (filter) filter.value = \"\";\n }\n function policyResourceAutocompleteValue(row, value) {\n if (!row) return \"\";\n const typed = value.trim();\n if (!typed) return \"\";\n const kind = row.dataset.policyKind;\n const selected = selectedPolicyPatterns(row);\n const resources = availablePolicyResources(kind, selected, typed);\n const exact = resources.find((resource) => resource.name.toLowerCase() === typed.toLowerCase());\n return exact?.name || resources[0]?.name || typed;\n }\n function removePolicyPattern(row, pattern) {\n if (!row || !pattern) return;\n const textarea = row.querySelector(\"[data-policy-patterns]\");\n const patterns = parsePolicyPatterns(textarea.value).filter((candidate) => candidate !== pattern);\n textarea.value = patterns.join(\"\\n\");\n }\n function refreshPolicyResourceControls(root = document) {\n const rows = root.matches?.(\"[data-policy-row]\") ? [root] : root.querySelectorAll(\"[data-policy-row]\");\n rows.forEach((row) => {\n const kind = row.dataset.policyKind;\n const patterns = selectedPolicyPatterns(row);\n const selected = row.querySelector(\"[data-selected-patterns]\");\n if (selected) selected.innerHTML = selectedPolicyPatternButtonsHtml(patterns);\n const filter = row.querySelector(\"[data-resource-filter]\")?.value || \"\";\n const options = row.querySelector(\"[data-resource-options]\");\n if (options) options.innerHTML = resourceOptionsHtml(kind, patterns);\n const list = row.querySelector(\"[data-resource-list]\");\n if (list) list.innerHTML = resourceListHtml(kind, patterns, filter);\n });\n }\n function selectedPolicyPatterns(row) {\n if (!row || (row.dataset.policyMode || \"none\") === \"none\") return [];\n return parsePolicyPatterns(row.querySelector(\"[data-policy-patterns]\")?.value || \"\");\n }\n function addPolicyPattern(row, name) {\n if (!row || !name) return;\n if ((row.dataset.policyMode || \"none\") === \"none\") setPolicyRowMode(row, \"allow\");\n const textarea = row.querySelector(\"[data-policy-patterns]\");\n const patterns = parsePolicyPatterns(textarea.value);\n if (!patterns.includes(name)) patterns.push(name);\n textarea.value = patterns.join(\"\\n\");\n }\n function syncResourcePolicyFromTab() {\n if (!currentStack2()) return;\n const stack = currentStack2();\n const errors = [];\n document.querySelectorAll(\"[data-policy-row]\").forEach((row) => {\n const kind = row.dataset.policyKind;\n const mode = row.dataset.policyMode || \"none\";\n const patterns = mode === \"none\" ? [] : parsePolicyPatterns(row.querySelector(\"[data-policy-patterns]\").value);\n const duplicate = duplicatePolicyPattern(patterns);\n if (duplicate) errors.push(kind + \".\" + mode + \" has duplicate pattern: \" + duplicate);\n const policy = { ...stackPolicyObject(kind) };\n delete policy.allow;\n delete policy.deny;\n if (mode === \"allow\" && patterns.length) policy.allow = patterns;\n if (mode === \"deny\" && patterns.length) policy.deny = patterns;\n if (Object.keys(policy).length) stack[kind] = policy;\n else delete stack[kind];\n setPolicyRowMode(row, mode);\n });\n policyError = errors[0] || \"\";\n markDirty2();\n refreshPolicySummaries();\n refreshPolicyResourceControls();\n if (policyError) setStatus2(policyError, \"error\");\n }\n function stackPolicyObject(kind) {\n const policy = currentStack2()?.[kind];\n return policy && typeof policy === \"object\" && !Array.isArray(policy) ? policy : {};\n }\n function policyMode(policy) {\n const allow = Array.isArray(policy.allow) ? policy.allow : [];\n const deny = Array.isArray(policy.deny) ? policy.deny : [];\n if (deny.length && !allow.length) return \"deny\";\n if (allow.length) return \"allow\";\n return \"none\";\n }\n function setPolicyRowMode(row, mode) {\n if (!row) return;\n row.dataset.policyMode = mode || \"none\";\n row.querySelectorAll(\"[data-policy-mode-option]\").forEach((button) => {\n button.classList.toggle(\"active\", button.dataset.policyModeOption === row.dataset.policyMode);\n });\n const patterns = row.querySelector(\"[data-policy-patterns]\");\n if (!patterns) return;\n patterns.disabled = row.dataset.policyMode === \"none\";\n patterns.placeholder = policyPatternPlaceholder(row.dataset.policyMode);\n }\n function policyPatternPlaceholder(mode) {\n if (mode === \"allow\") return \"read\\nbrowser-*\";\n if (mode === \"deny\") return \"browser-danger\\nlegacy-*\";\n return \"\";\n }\n function policyPatternsToText(patterns) {\n return Array.isArray(patterns) ? patterns.join(\"\\n\") : \"\";\n }\n function parsePolicyPatterns(value) {\n return String(value || \"\").split(/[\\n,]/).map((pattern) => pattern.trim()).filter(Boolean);\n }\n function duplicatePolicyPattern(patterns) {\n const seen = /* @__PURE__ */ new Set();\n for (const pattern of patterns) {\n if (seen.has(pattern)) return pattern;\n seen.add(pattern);\n }\n return \"\";\n }\n function refreshPolicySummaries() {\n document.querySelectorAll(\"[data-policy-row]\").forEach((row) => {\n const summary = row.querySelector(\"[data-policy-summary]\");\n if (!summary) return;\n const kind = row.dataset.policyKind;\n const mode = row.dataset.policyMode || \"none\";\n const patterns = mode === \"none\" ? [] : parsePolicyPatterns(row.querySelector(\"[data-policy-patterns]\").value);\n const policy = mode === \"allow\" ? { allow: patterns } : mode === \"deny\" ? { deny: patterns } : {};\n summary.textContent = policySummary(kind, policy);\n setPolicyRowMode(row, mode);\n });\n }\n function policySummary(kind, policy) {\n const allow = Array.isArray(policy.allow) ? policy.allow : [];\n const deny = Array.isArray(policy.deny) ? policy.deny : [];\n if (allow.length && deny.length) return \"Invalid mixed policy.\";\n if (allow.some((pattern) => pattern !== \"*\")) return \"Allow list active: \" + allow.length + \" pattern\" + (allow.length === 1 ? \"\" : \"s\") + \".\";\n if (allow.length) return \"Unrestricted \" + kind + \".\";\n if (deny.length) return \"Deny list active: \" + deny.length + \" pattern\" + (deny.length === 1 ? \"\" : \"s\") + \".\";\n return \"Unrestricted \" + kind + \".\";\n }\n return {\n renderTab: renderPolicyTab,\n reset: () => {\n policyError = \"\";\n },\n getError: () => policyError\n };\n }\n\n // src/web-editor/client/regex-editor.ts\n function createRegexEditor(deps) {\n const currentStack2 = () => deps.getStack();\n const { markDirty: markDirty2, setStatus: setStatus2 } = deps;\n const showStackModal2 = deps.showModal;\n const { run: run2, validateStack: validateStack2 } = deps;\n let regexError = \"\";\n const regexStages = [\"history\", \"compiled\"];\n const regexEffects = [\"outgoing\", \"finalize\", \"display\", \"both\"];\n const regexTargets = [\"system\", \"messages\"];\n const regexRoles = [\"system\", \"user\", \"assistant\", \"custom\"];\n function openRegexEditor() {\n if (!currentStack2()) return;\n showStackModal2(\n \"Regex rules\",\n \"Ordered JavaScript RegExp replacements for outgoing prompt text and finalized assistant messages.\",\n regexEditorBody()\n );\n bindRegexEditor();\n }\n function regexEditorBody() {\n const candidateRules = currentStack2().regex?.rules;\n const rules = Array.isArray(candidateRules) ? candidateRules : [];\n const rows = rules.map((rule) => regexRuleRowHtml(rule)).join(\"\");\n return '<div class=\"tab-section-title\">Regex rules</div><div class=\"tab-section-meta\">Ordered JavaScript RegExp replacements for outgoing prompt text and finalized assistant messages.</div><div class=\"modal-toolbar\"><button id=\"addRegexRuleBtn\" data-icon=\"+\" title=\"Add a regex rule\">Add rule</button><button id=\"validateRegexRulesBtn\" data-icon=\"!\" title=\"Validate the edited stack\">Validate</button><span class=\"modal-spacer\"></span><span class=\"modal-meta\">Save writes these rules to stack.regex.rules.</span></div><div class=\"data-table\" id=\"regexRows\">' + rows + \"</div>\";\n }\n function regexRuleRowHtml(rule = {}) {\n const original = JSON.stringify(rule || {});\n const enabled = rule.enabled !== false;\n const targets = Array.isArray(rule.targets) ? rule.targets : [];\n const roles2 = Array.isArray(rule.roles) ? rule.roles : [];\n return '<div class=\"data-row regex-row\" data-regex-row><div class=\"regex-controls\"><button type=\"button\" data-regex-up=\"true\" data-icon=\"\u2191\" title=\"Move this rule up\">Up</button><button type=\"button\" data-regex-down=\"true\" data-icon=\"\u2193\" title=\"Move this rule down\">Down</button></div><div class=\"regex-fields\"><textarea data-regex-original hidden>' + escapeHtml(original) + '</textarea><label class=\"checkline\"><input type=\"checkbox\" data-regex-enabled ' + (enabled ? \"checked\" : \"\") + \"> Enabled</label>\" + regexTextField(\"data-regex-id\", \"ID\", rule.id || \"\", \"trim-ooc\") + regexTextField(\"data-regex-name\", \"Name\", rule.name || \"\", \"Readable label\") + regexSelect(\"data-regex-stage\", \"Stage\", rule.stage || \"compiled\", regexStages) + regexSelect(\"data-regex-effect\", \"Effect\", rule.effect || \"outgoing\", regexEffects) + regexTextField(\"data-regex-flags\", \"Flags\", rule.flags || \"\", \"gimsu\") + regexCheckGroup(\"Targets\", \"data-regex-target\", regexTargets, targets, \"compiled only; empty means default\") + regexCheckGroup(\"Roles\", \"data-regex-role\", regexRoles, roles2, \"message rules only; empty means all roles\") + regexNumberField(\"data-regex-max-messages\", \"Max messages\", rule.maxMessages ?? \"\") + regexNumberField(\"data-regex-max-chars\", \"Max chars\", rule.maxChars ?? \"\") + regexNumberField(\"data-regex-min-depth\", \"Min depth\", rule.minDepth ?? \"\", 0) + regexNumberField(\"data-regex-max-depth\", \"Max depth\", rule.maxDepth ?? \"\", 0) + regexTextArea(\"data-regex-trim-strings\", \"Trim strings\", Array.isArray(rule.trimStrings) ? rule.trimStrings.join(\"\\n\") : \"\", \"span-2\", \"one per line\") + regexTextArea(\"data-regex-pattern\", \"Pattern\", rule.pattern || \"\", \"span-3\", \"\\\\\\\\(OOC:[^)]+\\\\\\\\)\") + regexTextArea(\"data-regex-replace\", \"Replace\", rule.replace || \"\", \"span-3\", \"\") + '<div class=\"regex-warning wide\" data-regex-warning>' + escapeHtml(regexRuleWarning(rule)) + '</div></div><button type=\"button\" class=\"danger\" data-delete-row=\"true\" data-icon=\"\u00D7\" title=\"Delete this regex rule\">Delete</button></div>';\n }\n function regexTextField(attribute, label, value, placeholder = \"\") {\n return '<div class=\"field\"><label>' + escapeHtml(label) + \"</label><input \" + attribute + ' value=\"' + attr(value) + '\" placeholder=\"' + attr(placeholder) + '\"></div>';\n }\n function regexNumberField(attribute, label, value, min = 1) {\n return '<div class=\"field\"><label>' + escapeHtml(label) + '</label><input type=\"number\" min=\"' + attr(min) + '\" ' + attribute + ' value=\"' + attr(value) + '\"></div>';\n }\n function regexTextArea(attribute, label, value, className, placeholder = \"\") {\n return '<div class=\"field ' + className + '\"><label>' + escapeHtml(label) + \"</label><textarea \" + attribute + ' spellcheck=\"false\" placeholder=\"' + attr(placeholder) + '\">' + escapeHtml(value) + \"</textarea></div>\";\n }\n function regexSelect(attribute, label, value, choices) {\n return '<div class=\"field\"><label>' + escapeHtml(label) + \"</label><select \" + attribute + \">\" + choices.map((choice) => '<option value=\"' + attr(choice) + '\"' + (choice === value ? \" selected\" : \"\") + \">\" + escapeHtml(choice) + \"</option>\").join(\"\") + \"</select></div>\";\n }\n function regexCheckGroup(label, attribute, choices, selected, help) {\n const selectedSet = new Set(selected || []);\n return '<div class=\"field span-2\"><label>' + escapeHtml(label) + '</label><div class=\"regex-checks\" title=\"' + attr(help) + '\">' + choices.map((choice) => '<label><input type=\"checkbox\" ' + attribute + ' value=\"' + attr(choice) + '\"' + (selectedSet.has(choice) ? \" checked\" : \"\") + \"> \" + escapeHtml(choice) + \"</label>\").join(\"\") + \"</div></div>\";\n }\n function bindRegexEditor() {\n el(\"addRegexRuleBtn\").onclick = () => {\n el(\"regexRows\").insertAdjacentHTML(\"beforeend\", regexRuleRowHtml(defaultRegexRule()));\n bindRegexEditor();\n syncRegexRulesFromModal();\n };\n el(\"validateRegexRulesBtn\").onclick = () => run2(validateStack2);\n document.querySelectorAll(\"[data-regex-row] input, [data-regex-row] textarea:not([data-regex-original]), [data-regex-row] select\").forEach((control) => {\n control.oninput = () => syncRegexRulesFromModal();\n control.onchange = () => syncRegexRulesFromModal();\n });\n document.querySelectorAll(\"[data-regex-row] [data-delete-row]\").forEach((button) => {\n button.onclick = (event) => {\n event.target.closest(\"[data-regex-row]\").remove();\n syncRegexRulesFromModal();\n };\n });\n document.querySelectorAll(\"[data-regex-up]\").forEach((button) => {\n button.onclick = (event) => {\n const row = event.target.closest(\"[data-regex-row]\");\n const previous = row.previousElementSibling;\n if (!previous) return;\n row.parentNode.insertBefore(row, previous);\n syncRegexRulesFromModal();\n };\n });\n document.querySelectorAll(\"[data-regex-down]\").forEach((button) => {\n button.onclick = (event) => {\n const row = event.target.closest(\"[data-regex-row]\");\n const next = row.nextElementSibling;\n if (!next) return;\n row.parentNode.insertBefore(next, row);\n syncRegexRulesFromModal();\n };\n });\n refreshRegexWarnings();\n }\n function defaultRegexRule() {\n return {\n id: uniqueRegexRuleId(),\n enabled: true,\n stage: \"compiled\",\n effect: \"outgoing\",\n targets: [\"messages\"],\n pattern: \"\",\n replace: \"\"\n };\n }\n function uniqueRegexRuleId() {\n const existing = new Set((currentStack2()?.regex?.rules || []).map((rule) => rule?.id).filter(Boolean));\n let index = existing.size + 1;\n let id = \"regex-\" + index;\n while (existing.has(id)) id = \"regex-\" + ++index;\n return id;\n }\n function syncRegexRulesFromModal() {\n if (!currentStack2()) return;\n const rules = [];\n const seen = /* @__PURE__ */ new Set();\n const errors = [];\n document.querySelectorAll(\"[data-regex-row]\").forEach((row, index) => {\n const rule = regexRuleFromRow(row);\n const label = rule.id || \"rule \" + (index + 1);\n if (!rule.id) errors.push(\"Regex rule \" + (index + 1) + \" needs an id.\");\n else if (seen.has(rule.id)) errors.push(\"Duplicate regex rule id: \" + rule.id);\n seen.add(rule.id);\n if (!rule.pattern) errors.push(\"Regex rule \" + label + \" needs a pattern.\");\n if (row.querySelector(\"[data-regex-max-messages]\").value && !rule.maxMessages) errors.push(\"Regex rule \" + label + \" maxMessages must be a positive integer.\");\n if (row.querySelector(\"[data-regex-max-chars]\").value && !rule.maxChars) errors.push(\"Regex rule \" + label + \" maxChars must be a positive integer.\");\n if (row.querySelector(\"[data-regex-min-depth]\").value && rule.minDepth === void 0) errors.push(\"Regex rule \" + label + \" minDepth must be a non-negative integer.\");\n if (row.querySelector(\"[data-regex-max-depth]\").value && rule.maxDepth === void 0) errors.push(\"Regex rule \" + label + \" maxDepth must be a non-negative integer.\");\n if (rule.minDepth !== void 0 && rule.maxDepth !== void 0 && rule.maxDepth < rule.minDepth) errors.push(\"Regex rule \" + label + \" maxDepth must be greater than or equal to minDepth.\");\n rules.push(rule);\n });\n if (rules.length) {\n currentStack2().regex = { ...currentStack2().regex || {}, schemaVersion: currentStack2().regex?.schemaVersion || 1, rules };\n } else {\n delete currentStack2().regex;\n }\n regexError = errors[0] || \"\";\n markDirty2();\n refreshRegexWarnings();\n if (regexError) setStatus2(regexError, \"error\");\n }\n function regexRuleFromRow(row) {\n const rule = originalRegexRuleFromRow(row);\n for (const key of [\"id\", \"name\", \"enabled\", \"stage\", \"effect\", \"pattern\", \"flags\", \"replace\", \"trimStrings\", \"roles\", \"targets\", \"maxMessages\", \"maxChars\", \"minDepth\", \"maxDepth\"]) {\n delete rule[key];\n }\n rule.id = row.querySelector(\"[data-regex-id]\").value.trim();\n setOptionalObjectString(rule, \"name\", row.querySelector(\"[data-regex-name]\").value);\n rule.enabled = row.querySelector(\"[data-regex-enabled]\").checked;\n rule.stage = row.querySelector(\"[data-regex-stage]\").value || \"compiled\";\n rule.effect = row.querySelector(\"[data-regex-effect]\").value || \"outgoing\";\n rule.pattern = row.querySelector(\"[data-regex-pattern]\").value;\n const flags = row.querySelector(\"[data-regex-flags]\").value.trim();\n if (flags) rule.flags = flags;\n const replace = row.querySelector(\"[data-regex-replace]\").value;\n if (replace) rule.replace = replace;\n const trimStrings = row.querySelector(\"[data-regex-trim-strings]\").value.split(/\\r?\\n/).filter((line) => line.length > 0);\n if (trimStrings.length) rule.trimStrings = trimStrings;\n const roles2 = checkedRegexValues(row, \"data-regex-role\");\n if (roles2.length) rule.roles = roles2;\n const targets = checkedRegexValues(row, \"data-regex-target\");\n if (targets.length) rule.targets = targets;\n const maxMessages = positiveIntegerFromInput(row.querySelector(\"[data-regex-max-messages]\").value);\n const maxChars = positiveIntegerFromInput(row.querySelector(\"[data-regex-max-chars]\").value);\n const minDepth = nonNegativeIntegerFromInput(row.querySelector(\"[data-regex-min-depth]\").value);\n const maxDepth = nonNegativeIntegerFromInput(row.querySelector(\"[data-regex-max-depth]\").value);\n if (maxMessages) rule.maxMessages = maxMessages;\n if (maxChars) rule.maxChars = maxChars;\n if (minDepth !== void 0) rule.minDepth = minDepth;\n if (maxDepth !== void 0) rule.maxDepth = maxDepth;\n return rule;\n }\n function originalRegexRuleFromRow(row) {\n try {\n const parsed = JSON.parse(row.querySelector(\"[data-regex-original]\")?.value || \"{}\");\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? { ...parsed } : {};\n } catch {\n return {};\n }\n }\n function checkedRegexValues(row, attribute) {\n return Array.from(row.querySelectorAll(\"[\" + attribute + \"]\")).filter((input) => input.checked).map((input) => input.value);\n }\n function positiveIntegerFromInput(value) {\n if (!String(value || \"\").trim()) return void 0;\n const number = Number(value);\n return Number.isInteger(number) && number > 0 ? number : void 0;\n }\n function nonNegativeIntegerFromInput(value) {\n if (!String(value || \"\").trim()) return void 0;\n const number = Number(value);\n return Number.isInteger(number) && number >= 0 ? number : void 0;\n }\n function refreshRegexWarnings() {\n document.querySelectorAll(\"[data-regex-row]\").forEach((row) => {\n const warning = row.querySelector(\"[data-regex-warning]\");\n if (!warning) return;\n const text = regexRuleWarning(regexRuleFromRow(row));\n warning.textContent = text;\n warning.style.display = text ? \"\" : \"none\";\n });\n }\n function regexRuleWarning(rule) {\n if (rule.effect === \"finalize\") {\n return 'Warning: finalize runs after streaming and replaces the stored assistant transcript. Use stage \"compiled\" with target \"messages\".';\n }\n if (rule.effect === \"display\") {\n return \"Warning: display rules validate but are ignored at runtime until true display transforms exist.\";\n }\n if (rule.effect === \"both\") {\n return \"Warning: both is ignored at runtime; create separate outgoing and finalize rules instead.\";\n }\n if (typeof rule.replace === \"string\" && /\\{\\{\\s*match\\s*\\}\\}/i.test(rule.replace)) {\n return \"Warning: {{match}} is SillyTavern syntax. Use $& or $0 for the full match in pi-forge rules.\";\n }\n return \"\";\n }\n function setOptionalObjectString(target, key, value) {\n const trimmed = value.trim();\n if (trimmed) target[key] = trimmed;\n }\n return {\n open: openRegexEditor,\n renderBody: regexEditorBody,\n bind: bindRegexEditor,\n reset: () => {\n regexError = \"\";\n },\n getError: () => regexError\n };\n }\n\n // src/web-editor/client/main.ts\n var token = new URLSearchParams(location.search).get(\"token\") || \"\";\n var api = createEditorApi(token);\n var stacks = [];\n var cwd = \"\";\n var selectedId = \"\";\n var currentStack = null;\n var currentFilePath = \"\";\n var selectedItemIndex = -1;\n var dirty = false;\n var dragIndex = -1;\n var dragDropIndex = -1;\n var dragScrollFrame = 0;\n var dragScrollSpeed = 0;\n var dragClientY = 0;\n var optionsText = \"\";\n var optionsError = \"\";\n var sidebarCollapsed = false;\n var slotOptionsMode = \"form\";\n var policyResources = { tools: [], skills: [] };\n var latestDiagnostics = [];\n var stackVariablesError = \"\";\n var activeTab = \"items\";\n var metadataCollapsed = true;\n var currentTheme = readStoredTheme() || (window.matchMedia?.(\"(prefers-color-scheme: dark)\")?.matches ? \"dark\" : \"light\");\n var policyEditor = createPolicyEditor({\n getStack: () => currentStack,\n getResources: () => policyResources,\n markDirty,\n setStatus\n });\n var {\n validateStack,\n previewStack,\n refreshPayloadCapture,\n armPayloadCapture,\n clearPayloadCapture,\n openPayloadCapture,\n hidePreview,\n copyPreviewText,\n copyTextToClipboard\n } = createInspector({\n api,\n getSelectedId: () => selectedId,\n stackForSubmit,\n renderDiagnostics,\n renderItemList,\n setStatus\n });\n var regexEditor = createRegexEditor({\n getStack: () => currentStack,\n markDirty,\n setStatus,\n showModal: showStackModal,\n run,\n validateStack\n });\n var slotNames = [\n \"chat-history\",\n \"tools\",\n \"tool-guidelines\",\n \"skills\",\n \"project-context\",\n \"append-system-prompt\",\n \"variables\",\n \"date\",\n \"cwd\",\n \"date-cwd\",\n \"active-model\",\n \"pi-docs\"\n ];\n var roles = [\"\", \"system\", \"user\", \"assistant\", \"custom\"];\n function applyTheme(theme) {\n currentTheme = theme === \"dark\" ? \"dark\" : \"light\";\n document.body.dataset.theme = currentTheme;\n const button = el(\"themeBtn\");\n if (button) {\n button.textContent = currentTheme === \"dark\" ? \"Light\" : \"Dark\";\n button.title = currentTheme === \"dark\" ? \"Switch to light theme\" : \"Switch to dark theme\";\n }\n }\n function toggleTheme() {\n const next = currentTheme === \"dark\" ? \"light\" : \"dark\";\n writeStoredTheme(next);\n applyTheme(next);\n setStatus(next === \"dark\" ? \"Dark theme enabled\" : \"Light theme enabled\", \"success\");\n }\n applyTheme(currentTheme);\n function readStoredTheme() {\n try {\n const theme = localStorage.getItem(\"pi-forge-theme\");\n return theme === \"light\" || theme === \"dark\" ? theme : \"\";\n } catch {\n return \"\";\n }\n }\n function writeStoredTheme(theme) {\n try {\n localStorage.setItem(\"pi-forge-theme\", theme);\n } catch {\n }\n }\n function setStatus(text, tone = \"\") {\n el(\"status\").textContent = text;\n el(\"status\").style.color = tone === \"error\" ? \"var(--error)\" : tone === \"success\" ? \"var(--success)\" : \"var(--muted)\";\n }\n function markDirty() {\n dirty = true;\n renderDirtyState();\n setStatus(\"Unsaved changes\");\n }\n function renderDirtyState() {\n const badge = el(\"dirtyBadge\");\n if (!badge) return;\n badge.classList.toggle(\"visible\", dirty);\n updateActionState();\n }\n function updateActionState() {\n const hasStack = !!currentStack;\n for (const id of [\"activateBtn\", \"saveBtn\", \"validateBtn\", \"previewBtn\", \"forkBtn\", \"exportBtn\", \"deleteStackBtn\", \"addItemBtn\", \"addSlotBtn\", \"metadataToggleBtn\"]) {\n const button = el(id);\n if (button) button.disabled = !hasStack;\n }\n const deleteItemButton = el(\"deleteItemBtn\");\n if (deleteItemButton) deleteItemButton.disabled = !hasStack || selectedItemIndex < 0;\n document.querySelectorAll(\"[data-tab]\").forEach((button) => {\n button.disabled = !hasStack;\n });\n }\n async function loadStacks(preferId = selectedId) {\n const [data, resources] = await Promise.all([\n api(\"/api/stacks\"),\n api(\"/api/resources\")\n ]);\n stacks = data.stacks || [];\n policyResources = normalizePolicyResources(resources);\n cwd = data.cwd || \"\";\n el(\"cwd\").textContent = cwd;\n renderStackList();\n const next = stacks.find((stack) => stack.id === preferId) || stacks.find((stack) => stack.active) || stacks[0];\n if (next) await selectStack(next.id, { keepDirty: false });\n else renderEmpty();\n }\n async function selectStack(id, options = {}) {\n if (dirty && !options.keepDirty && !confirm(\"Discard unsaved changes?\")) return;\n const data = await api(\"/api/stacks/\" + encodeURIComponent(id));\n selectedId = id;\n const loadedStack = structuredClone(data.stack);\n currentStack = loadedStack;\n currentFilePath = data.filePath || \"\";\n selectedItemIndex = loadedStack.items.length ? 0 : -1;\n dirty = false;\n optionsError = \"\";\n stackVariablesError = \"\";\n regexEditor.reset();\n policyEditor.reset();\n renderDirtyState();\n renderAll(data.diagnostics || []);\n setStatus(\"Loaded \" + loadedStack.id);\n }\n function renderAll(diagnostics = []) {\n latestDiagnostics = diagnostics;\n renderStackList();\n renderSettings();\n renderActiveTab();\n renderDiagnostics(diagnostics);\n hidePreview();\n updateActionState();\n }\n function renderActiveTab() {\n document.querySelectorAll(\"[data-tab]\").forEach((button) => {\n button.classList.toggle(\"active\", button.dataset.tab === activeTab);\n });\n const workspace = el(\"workspace\");\n const panel = el(\"tabPanel\");\n if (activeTab === \"items\") {\n workspace.style.display = \"\";\n panel.classList.remove(\"open\");\n panel.innerHTML = \"\";\n renderItemList();\n renderItemEditor();\n return;\n }\n workspace.style.display = \"none\";\n panel.classList.add(\"open\");\n if (activeTab === \"regex\") renderRegexTab();\n else if (activeTab === \"policy\") policyEditor.renderTab();\n else if (activeTab === \"stack\") renderStackTab();\n }\n function renderStackList() {\n const list = el(\"stackList\");\n list.innerHTML = \"\";\n if (!stacks.length) {\n list.innerHTML = '<div class=\"side-empty\">No prompt stacks in this project.</div>';\n return;\n }\n for (const stack of stacks) {\n const row = document.createElement(\"button\");\n row.className = \"stack-row\" + (stack.active ? \" active\" : \"\") + (stack.id === selectedId ? \" selected\" : \"\");\n const diag = stack.errors ? '<span class=\"badge error\">' + stack.errors + \" error</span>\" : stack.warnings ? '<span class=\"badge warning\">' + stack.warnings + \" warning</span>\" : \"\";\n row.innerHTML = '<div class=\"stack-name\">' + escapeHtml(stack.id) + (stack.active ? '<span class=\"badge\">active</span>' : \"\") + diag + '</div><div class=\"stack-meta\">' + escapeHtml(stack.name || \"(unnamed)\") + '</div><div class=\"stack-meta\">' + stack.itemCount + \" items | \" + escapeHtml(stack.mode || \"replace\") + \"</div>\";\n row.onclick = () => selectStack(stack.id);\n list.appendChild(row);\n }\n }\n function normalizePolicyResources(value) {\n return {\n tools: normalizeResourceList(value?.tools),\n skills: normalizeResourceList(value?.skills)\n };\n }\n function normalizeResourceList(value) {\n if (!Array.isArray(value)) return [];\n return value.filter((resource) => resource && typeof resource === \"object\" && typeof resource.name === \"string\" && resource.name.trim()).map((resource) => ({\n name: resource.name.trim(),\n description: typeof resource.description === \"string\" ? resource.description : \"\",\n source: typeof resource.source === \"string\" ? resource.source : \"\",\n active: resource.active === true,\n hidden: resource.hidden === true\n }));\n }\n function renderSettings() {\n const settings = el(\"settings\");\n if (!currentStack) {\n settings.innerHTML = \"\";\n el(\"metadataSummary\").textContent = \"\";\n return;\n }\n const stack = currentStack;\n el(\"metadataPanel\").style.display = \"\";\n el(\"metadataSummary\").textContent = [\n currentStack.id || \"(no id)\",\n currentStack.name || \"(unnamed)\",\n currentStack.mode || \"replace\",\n currentFilePath || \"\"\n ].filter(Boolean).join(\" | \");\n settings.style.display = metadataCollapsed ? \"none\" : \"grid\";\n el(\"metadataToggleBtn\").textContent = metadataCollapsed ? \"Show metadata\" : \"Hide metadata\";\n el(\"metadataToggleBtn\").dataset.icon = metadataCollapsed ? \"\u25B8\" : \"\u25BE\";\n settings.innerHTML = [\n field(\"Stack ID\", '<input id=\"stackId\" value=\"' + attr(stack.id) + '\" readonly title=\"Stack IDs are immutable; use Fork to create a new ID.\">'),\n field(\"Name\", '<input id=\"stackName\" value=\"' + attr(stack.name || \"\") + '\">'),\n field(\"Mode\", '<select id=\"stackMode\"><option value=\"replace\">replace</option><option value=\"append\">append</option><option value=\"prepend\">prepend</option></select>'),\n field(\"Auto activate\", '<label class=\"checkline\"><input id=\"stackAuto\" type=\"checkbox\"> enabled</label>'),\n field(\"Description\", '<textarea id=\"stackDescription\" class=\"wide\">' + escapeHtml(stack.description || \"\") + \"</textarea>\", \"wide\"),\n field(\"File\", '<input value=\"' + attr(currentFilePath) + '\" disabled>', \"wide\")\n ].join(\"\");\n el(\"stackMode\").value = stack.mode || \"replace\";\n el(\"stackAuto\").checked = stack.autoActivate === true;\n el(\"stackName\").oninput = (event) => {\n setOptionalString(stack, \"name\", event.target.value);\n markDirty();\n };\n el(\"stackMode\").onchange = (event) => {\n stack.mode = event.target.value;\n markDirty();\n };\n el(\"stackAuto\").onchange = (event) => {\n stack.autoActivate = event.target.checked;\n markDirty();\n };\n el(\"stackDescription\").oninput = (event) => {\n setOptionalString(stack, \"description\", event.target.value);\n markDirty();\n };\n }\n function toggleMetadata() {\n metadataCollapsed = !metadataCollapsed;\n renderSettings();\n setStatus(metadataCollapsed ? \"Stack metadata hidden\" : \"Stack metadata shown\");\n }\n function renderItemList() {\n const list = el(\"itemList\");\n list.innerHTML = \"\";\n list.classList.toggle(\"drag-active\", dragIndex !== -1);\n if (!currentStack) return;\n el(\"itemCount\").textContent = currentStack.items.length + \" total\";\n list.ondragover = handleItemListDragOver;\n list.ondrop = handleItemListDrop;\n const diagnosticsByItem = diagnosticsForItems();\n currentStack.items.forEach((item, index) => {\n const row = document.createElement(\"div\");\n row.className = \"item-row\" + (index === selectedItemIndex ? \" selected\" : \"\") + (item.enabled === false ? \" disabled\" : \"\");\n row.dataset.itemIndex = String(index);\n row.draggable = true;\n const enabled = item.enabled !== false;\n const itemDiagnostics = diagnosticsByItem[item.id] || [];\n const errors = itemDiagnostics.filter((diag) => diag.level === \"error\").length;\n const warnings = itemDiagnostics.filter((diag) => diag.level === \"warning\").length;\n const diagBadge = errors ? '<span class=\"item-badge error\" title=\"' + attr(diagnosticTitle(itemDiagnostics)) + '\">' + errors + \"E</span>\" : warnings ? '<span class=\"item-badge warning\" title=\"' + attr(diagnosticTitle(itemDiagnostics)) + '\">' + warnings + \"W</span>\" : \"\";\n row.innerHTML = '<div class=\"drag-handle\" title=\"Drag to reorder\">\u2261</div><div><div class=\"item-title\">' + escapeHtml(displayItemName(item)) + diagBadge + '</div><div class=\"item-meta\">' + escapeHtml(item.kind) + \" | id: \" + escapeHtml(item.id) + (item.role ? \" | \" + escapeHtml(item.role) : \"\") + (item.kind === \"slot\" ? \" | \" + escapeHtml(item.slot || \"\") : \"\") + '</div></div><button type=\"button\" class=\"item-toggle ' + (enabled ? \"enabled\" : \"disabled\") + '\" title=\"Toggle item\">' + (enabled ? \"On\" : \"Off\") + \"</button>\";\n row.onclick = (event) => {\n if (event.target?.classList?.contains(\"item-toggle\")) return;\n selectedItemIndex = index;\n renderItemList();\n renderItemEditor();\n };\n query(row, \".item-toggle\").onclick = (event) => {\n event.stopPropagation();\n item.enabled = item.enabled === false;\n selectedItemIndex = index;\n markDirty();\n renderItemList();\n renderItemEditor();\n };\n row.ondragstart = (event) => {\n dragIndex = index;\n dragDropIndex = index;\n row.classList.add(\"dragging\");\n list.classList.add(\"drag-active\");\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", item.id || String(index));\n }\n updateItemDropIndicator();\n };\n row.ondragend = finishItemDrag;\n row.ondragover = handleItemListDragOver;\n row.ondrop = handleItemListDrop;\n list.appendChild(row);\n });\n updateItemDropIndicator();\n }\n function handleItemListDragOver(event) {\n if (dragIndex === -1 || !currentStack) return;\n event.preventDefault();\n dragClientY = event.clientY;\n updateItemDragAutoScroll(event.clientY);\n setItemDropIndex(dropIndexFromClientY(event.clientY));\n }\n function handleItemListDrop(event) {\n if (dragIndex === -1 || !currentStack) return;\n event.preventDefault();\n dropDraggedItem();\n }\n function dropDraggedItem() {\n if (!currentStack || dragIndex < 0 || dragIndex >= currentStack.items.length) {\n finishItemDrag();\n return;\n }\n let insertIndex = dragDropIndex;\n if (insertIndex < 0) insertIndex = dragIndex;\n insertIndex = Math.max(0, Math.min(insertIndex, currentStack.items.length));\n const [moved] = currentStack.items.splice(dragIndex, 1);\n if (!moved) {\n finishItemDrag();\n return;\n }\n if (dragIndex < insertIndex) insertIndex--;\n insertIndex = Math.max(0, Math.min(insertIndex, currentStack.items.length));\n currentStack.items.splice(insertIndex, 0, moved);\n selectedItemIndex = insertIndex;\n const changed = dragIndex !== insertIndex;\n finishItemDrag(false);\n if (changed) markDirty();\n renderItemList();\n renderItemEditor();\n }\n function setItemDropIndex(index) {\n if (!currentStack) return;\n const next = Math.max(0, Math.min(index, currentStack.items.length));\n if (dragDropIndex === next) return;\n dragDropIndex = next;\n updateItemDropIndicator();\n }\n function dropIndexFromClientY(clientY) {\n const list = el(\"itemList\");\n const rows = [...queryAll(list, \".item-row\")];\n if (!rows.length) return 0;\n const listRect = list.getBoundingClientRect();\n if (clientY <= listRect.top) return 0;\n if (clientY >= listRect.bottom) return rows.length;\n for (const row of rows) {\n const rect = row.getBoundingClientRect();\n const index = Number(row.dataset.itemIndex);\n if (clientY < rect.top + rect.height / 2) return index;\n }\n return rows.length;\n }\n function updateItemDropIndicator() {\n const list = el(\"itemList\");\n const rows = [...list.querySelectorAll(\".item-row\")];\n for (const row of rows) row.classList.remove(\"drop-before\", \"drop-after\");\n list.classList.toggle(\"drag-active\", dragIndex !== -1);\n if (dragIndex === -1 || dragDropIndex === -1 || !rows.length) return;\n if (dragDropIndex <= 0) rows[0].classList.add(\"drop-before\");\n else if (dragDropIndex >= rows.length) rows[rows.length - 1].classList.add(\"drop-after\");\n else rows[dragDropIndex].classList.add(\"drop-before\");\n }\n function updateItemDragAutoScroll(clientY) {\n const list = el(\"itemList\");\n const rect = list.getBoundingClientRect();\n const edge = Math.min(72, Math.max(36, rect.height / 5));\n let speed = 0;\n if (clientY < rect.top) speed = -Math.min(30, 8 + (rect.top - clientY) / 3);\n else if (clientY < rect.top + edge) speed = -Math.min(22, (rect.top + edge - clientY) / 3);\n else if (clientY > rect.bottom) speed = Math.min(30, 8 + (clientY - rect.bottom) / 3);\n else if (clientY > rect.bottom - edge) speed = Math.min(22, (clientY - (rect.bottom - edge)) / 3);\n dragScrollSpeed = speed;\n if (speed !== 0 && !dragScrollFrame) dragScrollFrame = requestAnimationFrame(runItemDragAutoScroll);\n }\n function runItemDragAutoScroll() {\n dragScrollFrame = 0;\n if (dragIndex === -1 || dragScrollSpeed === 0) return;\n const list = el(\"itemList\");\n list.scrollTop += dragScrollSpeed;\n setItemDropIndex(dropIndexFromClientY(dragClientY));\n dragScrollFrame = requestAnimationFrame(runItemDragAutoScroll);\n }\n function finishItemDrag(clearIndicator = true) {\n dragIndex = -1;\n dragDropIndex = -1;\n dragScrollSpeed = 0;\n dragClientY = 0;\n if (dragScrollFrame) {\n cancelAnimationFrame(dragScrollFrame);\n dragScrollFrame = 0;\n }\n if (clearIndicator) updateItemDropIndicator();\n }\n function handleDocumentItemDragOver(event) {\n if (dragIndex === -1 || !currentStack) return;\n event.preventDefault();\n dragClientY = event.clientY;\n updateItemDragAutoScroll(event.clientY);\n setItemDropIndex(dropIndexFromClientY(event.clientY));\n }\n function handleDocumentItemDrop(event) {\n if (dragIndex === -1 || !currentStack) return;\n event.preventDefault();\n dropDraggedItem();\n }\n function diagnosticsForItems() {\n const grouped = {};\n for (const diagnostic of latestDiagnostics || []) {\n if (!diagnostic.itemId) continue;\n if (!grouped[diagnostic.itemId]) grouped[diagnostic.itemId] = [];\n grouped[diagnostic.itemId].push(diagnostic);\n }\n return grouped;\n }\n function diagnosticTitle(diagnostics) {\n return diagnostics.map((diag) => (diag.level || \"info\").toUpperCase() + \": \" + (diag.message || \"\")).join(\"\\n\");\n }\n function renderItemEditor() {\n const editor = el(\"itemEditor\");\n if (!currentStack || selectedItemIndex < 0 || !currentStack.items[selectedItemIndex]) {\n editor.innerHTML = '<div class=\"empty\">No item selected.</div>';\n el(\"deleteItemBtn\").disabled = true;\n return;\n }\n el(\"deleteItemBtn\").disabled = false;\n const stack = currentStack;\n const item = stack.items[selectedItemIndex];\n optionsText = JSON.stringify(item.options || {}, null, 2);\n optionsError = \"\";\n const slotSelect = '<select id=\"itemSlot\">' + slotNames.map((slot) => '<option value=\"' + attr(slot) + '\">' + escapeHtml(slot) + \"</option>\").join(\"\") + \"</select>\";\n const roleSelect = '<select id=\"itemRole\">' + roles.map((role) => '<option value=\"' + attr(role) + '\">' + escapeHtml(role || \"(none)\") + \"</option>\").join(\"\") + \"</select>\";\n const kindSelect = '<select id=\"itemKind\"><option value=\"block\">block</option><option value=\"slot\">slot</option></select>';\n const topFields = '<div class=\"item-fields\">' + field(\"Kind\", kindSelect) + field(\"ID\", '<input id=\"itemId\" value=\"' + attr(item.id) + '\">') + field(\"Name\", '<input id=\"itemName\" value=\"' + attr(item.name || \"\") + '\">') + field(\"Role\", roleSelect) + (item.kind === \"slot\" ? field(\"Slot\", slotSelect) : \"\") + \"</div>\";\n const body = item.kind === \"block\" ? field(\"Content\", '<textarea id=\"itemContent\">' + escapeHtml(item.content || \"\") + \"</textarea>\", \"content-field\") : renderSlotOptionsEditor(item);\n editor.innerHTML = '<div class=\"item-form\">' + topFields + '<div class=\"item-body\">' + body + \"</div></div>\";\n el(\"itemKind\").value = item.kind;\n el(\"itemRole\").value = item.role || \"\";\n if (item.kind === \"slot\") el(\"itemSlot\").value = item.slot || \"chat-history\";\n el(\"itemKind\").onchange = (event) => {\n if (event.target.value === item.kind) return;\n const base = { id: item.id, name: item.name, enabled: item.enabled, role: item.role, tags: item.tags, source: item.source };\n stack.items[selectedItemIndex] = event.target.value === \"slot\" ? { ...base, kind: \"slot\", slot: \"chat-history\" } : { ...base, kind: \"block\", content: \"\" };\n markDirty();\n renderItemList();\n renderItemEditor();\n };\n el(\"itemId\").oninput = (event) => {\n item.id = event.target.value;\n markDirty();\n renderItemList();\n };\n el(\"itemName\").oninput = (event) => {\n setOptionalString(item, \"name\", event.target.value);\n markDirty();\n };\n el(\"itemRole\").onchange = (event) => {\n setOptionalString(item, \"role\", event.target.value);\n markDirty();\n renderItemList();\n };\n if (item.kind === \"block\") {\n el(\"itemContent\").oninput = (event) => {\n item.content = event.target.value;\n markDirty();\n };\n } else {\n el(\"itemSlot\").onchange = (event) => {\n item.slot = event.target.value;\n markDirty();\n renderItemList();\n };\n bindSlotOptionsEditor(item);\n }\n }\n function renderSlotOptionsEditor(item) {\n const options = item.options || {};\n const jsonActive = slotOptionsMode === \"json\";\n const formButton = '<button id=\"slotOptionsFormBtn\" type=\"button\" class=\"' + (!jsonActive ? \"active\" : \"\") + '\">Form</button>';\n const jsonButton = '<button id=\"slotOptionsJsonBtn\" type=\"button\" class=\"' + (jsonActive ? \"active\" : \"\") + '\">JSON</button>';\n const body = jsonActive ? '<textarea id=\"itemOptions\" class=\"json-options\">' + escapeHtml(optionsText) + \"</textarea>\" : renderSlotOptionsForm(item, options);\n return '<div class=\"field wide slot-options\"><label>Slot options</label><div class=\"segmented\">' + formButton + jsonButton + \"</div>\" + body + \"</div>\";\n }\n function renderSlotOptionsForm(item, options) {\n const fields = [];\n if (item.slot === \"chat-history\") {\n fields.push(\n optionCheckbox(\"includeLastUserMessage\", \"Include last user message\", options.includeLastUserMessage !== false),\n optionCheckbox(\"stripAssistantThinking\", \"Strip assistant thinking\", options.stripAssistantThinking === true),\n optionCheckbox(\"includeSummaries\", \"Include summaries\", options.includeSummaries !== false),\n optionSelect(\"toolMode\", \"Tool history\", options.toolMode || \"keep\", [\"keep\", \"drop\"]),\n optionText(\"roles\", \"Roles\", Array.isArray(options.roles) ? options.roles.join(\", \") : \"\"),\n optionNumber(\"maxMessages\", \"Max messages\", options.maxMessages ?? \"\"),\n optionNumber(\"maxChars\", \"Max chars\", options.maxChars ?? \"\")\n );\n }\n if (item.slot === \"variables\") {\n fields.push(\n optionCheckbox(\"includeStatic\", \"Include static variables\", options.includeStatic !== false),\n optionCheckbox(\"includeSession\", \"Include session variables\", options.includeSession !== false),\n optionCheckbox(\"includeTurn\", \"Include turn variables\", options.includeTurn !== false),\n optionSelect(\"format\", \"Format\", options.format || \"xml\", [\"xml\", \"plain\"])\n );\n }\n if ([\"tools\", \"tool-guidelines\", \"skills\", \"project-context\"].includes(item.slot)) {\n fields.push(optionSelect(\"format\", \"Format\", options.format || \"xml\", [\"xml\", \"plain\"]));\n }\n if ([\"date\", \"date-cwd\"].includes(item.slot)) {\n fields.push(optionCheckbox(\"includeTime\", \"Include current time\", options.includeTime === true));\n }\n if (fields.length === 0) {\n fields.push('<div class=\"wide option-note\">This slot has no structured options yet. Use JSON mode for advanced settings.</div>');\n }\n fields.push('<div class=\"wide option-note\">Unknown option keys are preserved. Use JSON mode for advanced settings.</div>');\n return '<div class=\"options-grid\">' + fields.join(\"\") + \"</div>\";\n }\n function bindSlotOptionsEditor(item) {\n el(\"slotOptionsFormBtn\").onclick = () => {\n slotOptionsMode = \"form\";\n renderItemEditor();\n };\n el(\"slotOptionsJsonBtn\").onclick = () => {\n slotOptionsMode = \"json\";\n renderItemEditor();\n };\n if (slotOptionsMode === \"json\") {\n el(\"itemOptions\").oninput = (event) => {\n optionsText = event.target.value;\n try {\n const parsed = optionsText.trim() ? JSON.parse(optionsText) : {};\n item.options = Object.keys(parsed).length ? parsed : void 0;\n optionsError = \"\";\n markDirty();\n } catch (error) {\n optionsError = error instanceof Error ? error.message : String(error);\n setStatus(\"Invalid item options JSON\", \"error\");\n }\n };\n return;\n }\n document.querySelectorAll(\"[data-option]\").forEach((control) => {\n control.onchange = (event) => {\n const target = event.target;\n const key = target.dataset.option;\n if (!key) return;\n if (target.type === \"checkbox\") {\n setSlotOption(item, key, target.checked, defaultSlotOptionValue(key));\n } else if (target.type === \"number\") {\n const value = target.value.trim();\n setSlotOption(item, key, value ? Number(value) : void 0);\n } else if (target.dataset.array === \"true\") {\n const values = target.value.split(\",\").map((part) => part.trim()).filter(Boolean);\n setSlotOption(item, key, values.length ? values : void 0);\n } else {\n setSlotOption(item, key, target.value || void 0, defaultSlotOptionValue(key));\n }\n markDirty();\n };\n });\n }\n function setSlotOption(item, key, value, defaultValue = void 0) {\n const options = { ...item.options || {} };\n if (value === void 0 || value === defaultValue) delete options[key];\n else options[key] = value;\n item.options = Object.keys(options).length ? options : void 0;\n }\n function defaultSlotOptionValue(key) {\n if ([\"includeLastUserMessage\", \"includeSummaries\", \"includeStatic\", \"includeSession\", \"includeTurn\"].includes(key)) return true;\n if ([\"stripAssistantThinking\", \"includeTime\"].includes(key)) return false;\n if (key === \"toolMode\") return \"keep\";\n if (key === \"format\") return \"xml\";\n return void 0;\n }\n function optionCheckbox(key, label, checked) {\n return '<label class=\"checkline\" title=\"' + attr(optionHelp(key)) + '\"><input type=\"checkbox\" data-option=\"' + attr(key) + '\" ' + (checked ? \"checked\" : \"\") + \"> \" + escapeHtml(label) + \"</label>\";\n }\n function optionSelect(key, label, value, choices) {\n return '<div class=\"field\" title=\"' + attr(optionHelp(key)) + '\"><label>' + escapeHtml(label) + '</label><select data-option=\"' + attr(key) + '\">' + choices.map((choice) => '<option value=\"' + attr(choice) + '\"' + (choice === value ? \" selected\" : \"\") + \">\" + escapeHtml(choice) + \"</option>\").join(\"\") + \"</select></div>\";\n }\n function optionText(key, label, value) {\n return '<div class=\"field\" title=\"' + attr(optionHelp(key)) + '\"><label>' + escapeHtml(label) + '</label><input data-option=\"' + attr(key) + '\" data-array=\"true\" value=\"' + attr(value) + '\" placeholder=\"comma,separated\"></div>';\n }\n function optionNumber(key, label, value) {\n return '<div class=\"field\" title=\"' + attr(optionHelp(key)) + '\"><label>' + escapeHtml(label) + '</label><input type=\"number\" min=\"1\" data-option=\"' + attr(key) + '\" value=\"' + attr(value) + '\"></div>';\n }\n function optionHelp(key) {\n const descriptions = {\n includeLastUserMessage: \"Keep the latest user message inside the inserted chat history.\",\n stripAssistantThinking: \"Remove prior assistant thinking blocks from inserted chat history while keeping visible text, tool calls, and tool results.\",\n includeSummaries: \"Keep Pi branch and compaction summary messages inside inserted chat history.\",\n toolMode: \"Keep tool calls/results or drop prior tool history from inserted chat history.\",\n roles: \"Optional comma-separated message roles to keep, such as user, assistant, toolResult, compactionSummary.\",\n maxMessages: \"Keep only the most recent N chat-history messages after filtering.\",\n maxChars: \"Keep only the most recent chat-history messages within an approximate character budget.\",\n includeStatic: \"Include static stack variables in this variables slot.\",\n includeSession: \"Include session variables created by template macros.\",\n includeTurn: \"Include temporary turn variables created during prompt compilation.\",\n includeTime: \"Render the current time in HH:MM:SS after the current date.\",\n format: \"Choose XML or compact plain text rendering.\"\n };\n return descriptions[key] || \"Advanced slot option.\";\n }\n function showStackModal(title, meta, body, options = {}) {\n const pane = el(\"stackModal\");\n pane.innerHTML = '<div class=\"modal-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"' + attr(title) + '\"><div class=\"modal-head\"><div><div class=\"modal-title\">' + escapeHtml(title) + '</div><div class=\"modal-meta\">' + escapeHtml(meta || \"\") + '</div></div><div class=\"modal-actions\"><button data-modal-close=\"true\" data-icon=\"\u00D7\" title=\"Close this dialog\">Close</button></div></div><div class=\"modal-body ' + attr(options.bodyClass || \"\") + '\">' + body + \"</div></div>\";\n pane.classList.add(\"open\");\n }\n function closeStackModal() {\n const pane = el(\"stackModal\");\n pane.classList.remove(\"open\");\n pane.innerHTML = \"\";\n }\n function setContextOption(key, value, defaultValue) {\n const stack = currentStack;\n const context = { ...stack.context || {} };\n if (value === defaultValue || value === void 0) delete context[key];\n else context[key] = value;\n if (Object.keys(context).length) stack.context = context;\n else delete stack.context;\n }\n function renderRegexTab() {\n if (!currentStack) return;\n el(\"tabPanel\").innerHTML = '<div class=\"tab-section\">' + regexEditor.renderBody() + \"</div>\";\n regexEditor.bind();\n }\n function renderStackTab() {\n if (!currentStack) return;\n const json = JSON.stringify(stackForDisplay(), null, 2);\n const variableRows = Object.entries(currentStack.variables || {}).sort(([a], [b]) => a.localeCompare(b)).map(([name, value]) => variableRowHtml(name, value)).join(\"\");\n el(\"tabPanel\").innerHTML = '<div class=\"tab-section\"><div class=\"tab-section-title\">Context options</div><div class=\"tab-section-meta\">Stack-level behavior for how pi-forge rewrites Pi conversation context.</div><label class=\"checkline\" title=\"Allow multiple enabled chat-history slots. When off, only the first enabled chat-history slot is expanded.\"><input id=\"allowDuplicateChatHistoryInput\" type=\"checkbox\" ' + (currentStack.context?.allowDuplicateChatHistory === true ? \"checked\" : \"\") + '> Allow duplicate chat-history slots</label><div class=\"option-note\">Keep this off unless you intentionally want the same conversation history injected more than once.</div></div><div class=\"tab-section\"><div class=\"tab-section-title\">Stack variables</div><div class=\"tab-section-meta\">Static string variables available to template macros and variables slots.</div><div class=\"modal-toolbar\"><button id=\"addVariableBtn\" data-icon=\"+\" title=\"Add a static stack variable\">Add variable</button><span class=\"modal-spacer\"></span><span class=\"modal-meta\">Saved in stack.variables.</span></div><div class=\"data-table\" id=\"variablesRows\"><div class=\"data-row header variable-row\"><div>Name</div><div>Value</div><div></div></div>' + variableRows + '</div></div><div class=\"tab-section\"><div class=\"tab-section-title\">Stack JSON</div><div class=\"tab-section-meta\">Raw recovery view for advanced fields. Apply updates the editor; Save writes to disk.</div><div class=\"modal-toolbar\"><button id=\"copyStackJsonBtn\" data-icon=\"\u25A1\" title=\"Copy this JSON to the clipboard\">Copy</button><button id=\"applyStackJsonBtn\" class=\"primary\" data-icon=\"\u2713\" title=\"Apply this JSON to the editor without saving\">Apply to editor</button><span class=\"modal-spacer\"></span><span id=\"stackJsonStatus\" class=\"modal-meta\">Unsaved stack JSON draft.</span></div><textarea id=\"stackJsonText\" class=\"raw-json-editor\" spellcheck=\"false\">' + escapeHtml(json) + \"</textarea></div>\";\n el(\"allowDuplicateChatHistoryInput\").onchange = (event) => {\n setContextOption(\"allowDuplicateChatHistory\", event.target.checked, false);\n markDirty();\n };\n bindVariablesEditor();\n el(\"copyStackJsonBtn\").onclick = () => run(copyRawStackJson);\n el(\"applyStackJsonBtn\").onclick = () => run(applyRawStackJson);\n }\n function stackForDisplay() {\n if (!currentStack) throw new Error(\"No stack selected.\");\n const clone = structuredClone(currentStack);\n if (!clone.type) clone.type = \"pi-forge.prompt-stack\";\n if (!clone.schemaVersion) clone.schemaVersion = 1;\n return clone;\n }\n async function copyRawStackJson() {\n await copyTextToClipboard(el(\"stackJsonText\").value);\n el(\"stackJsonStatus\").textContent = \"Copied JSON.\";\n setStatus(\"Copied stack JSON\", \"success\");\n }\n async function applyRawStackJson() {\n const text = el(\"stackJsonText\").value;\n const parsed = JSON.parse(text);\n validateRawStackJson(parsed);\n const stack = parsed;\n currentStack = stack;\n if (!stack.schemaVersion) stack.schemaVersion = 1;\n if (!stack.type) stack.type = \"pi-forge.prompt-stack\";\n selectedItemIndex = stack.items.length ? Math.min(Math.max(selectedItemIndex, 0), stack.items.length - 1) : -1;\n optionsError = \"\";\n stackVariablesError = \"\";\n regexEditor.reset();\n policyEditor.reset();\n closeStackModal();\n markDirty();\n renderAll(latestDiagnostics);\n setStatus(\"Applied stack JSON to editor\", \"success\");\n }\n function validateRawStackJson(stack) {\n if (!stack || typeof stack !== \"object\" || Array.isArray(stack)) throw new Error(\"Stack JSON must be an object.\");\n if (typeof stack.id !== \"string\" || !stack.id.trim()) throw new Error(\"Stack JSON needs a non-empty string id.\");\n if (!Array.isArray(stack.items)) throw new Error(\"Stack JSON needs an items array.\");\n stack.items.forEach((item, index) => {\n const label = \"Item \" + (index + 1);\n if (!item || typeof item !== \"object\" || Array.isArray(item)) throw new Error(label + \" must be an object.\");\n if (item.kind !== \"block\" && item.kind !== \"slot\") throw new Error(label + \" kind must be block or slot.\");\n if (typeof item.id !== \"string\" || !item.id.trim()) throw new Error(label + \" needs a non-empty string id.\");\n if (item.kind === \"block\" && typeof item.content !== \"string\") throw new Error(label + \" block content must be a string.\");\n if (item.kind === \"slot\" && typeof item.slot !== \"string\") throw new Error(label + \" slot must be a string.\");\n });\n }\n function variableRowHtml(name = \"\", value = \"\") {\n return '<div class=\"data-row variable-row\" data-var-row><input data-var-name value=\"' + attr(name) + '\" placeholder=\"char\"><input data-var-value value=\"' + attr(value) + '\" placeholder=\"\u6CC9\u6B64\u65B9\"><button type=\"button\" class=\"danger\" data-delete-row=\"true\" data-icon=\"\u00D7\" title=\"Delete this stack variable\">Delete</button></div>';\n }\n function bindVariablesEditor() {\n el(\"addVariableBtn\").onclick = () => {\n el(\"variablesRows\").insertAdjacentHTML(\"beforeend\", variableRowHtml(uniqueVariableName()));\n bindVariablesEditor();\n syncVariablesFromModal();\n };\n document.querySelectorAll(\"[data-var-row] input\").forEach((input) => {\n input.oninput = () => syncVariablesFromModal();\n });\n document.querySelectorAll(\"[data-var-row] [data-delete-row]\").forEach((button) => {\n button.onclick = (event) => {\n event.target.closest(\"[data-var-row]\").remove();\n syncVariablesFromModal();\n };\n });\n }\n function uniqueVariableName() {\n const existing = new Set(Object.keys(currentStack?.variables || {}));\n let index = existing.size + 1;\n let name = \"var\" + index;\n while (existing.has(name)) name = \"var\" + ++index;\n return name;\n }\n function syncVariablesFromModal() {\n if (!currentStack) return;\n const variables = {};\n const seen = /* @__PURE__ */ new Set();\n let duplicate = false;\n document.querySelectorAll(\"[data-var-row]\").forEach((row) => {\n const name = row.querySelector(\"[data-var-name]\").value.trim();\n const value = row.querySelector(\"[data-var-value]\").value;\n if (!name) return;\n if (seen.has(name)) duplicate = true;\n seen.add(name);\n variables[name] = value;\n });\n if (Object.keys(variables).length) currentStack.variables = variables;\n else delete currentStack.variables;\n stackVariablesError = duplicate ? \"Duplicate stack variable names.\" : \"\";\n markDirty();\n if (duplicate) setStatus(stackVariablesError, \"error\");\n }\n function addItem(kind) {\n if (!currentStack) return;\n const id = nextNumericItemId();\n const insertIndex = selectedItemIndex >= 0 && selectedItemIndex < currentStack.items.length ? selectedItemIndex + 1 : currentStack.items.length;\n currentStack.items.splice(insertIndex, 0, kind === \"slot\" ? { kind: \"slot\", id, enabled: true, slot: \"chat-history\" } : { kind: \"block\", id, enabled: true, role: \"user\", content: \"\" });\n selectedItemIndex = insertIndex;\n markDirty();\n renderItemList();\n renderItemEditor();\n }\n function nextNumericItemId() {\n const existing = new Set((currentStack?.items || []).map((item) => String(item.id)));\n let index = 1;\n while (existing.has(String(index))) index++;\n return String(index);\n }\n function deleteSelectedItem() {\n if (!currentStack || selectedItemIndex < 0) return;\n const item = currentStack.items[selectedItemIndex];\n if (!confirm(\"Delete item \" + item.id + \"?\")) return;\n currentStack.items.splice(selectedItemIndex, 1);\n selectedItemIndex = Math.min(selectedItemIndex, currentStack.items.length - 1);\n markDirty();\n renderItemList();\n renderItemEditor();\n }\n async function saveStack() {\n const stack = stackForSubmit();\n const data = await api(\"/api/stacks/\" + encodeURIComponent(selectedId), { method: \"PUT\", body: { stack } });\n stacks = data.stacks || stacks;\n selectedId = data.stack?.id || stack.id;\n currentStack = structuredClone(stack);\n dirty = false;\n renderDirtyState();\n renderAll(data.stack?.diagnostics || []);\n setStatus(\"Saved \" + selectedId, \"success\");\n await selectStack(selectedId, { keepDirty: true });\n }\n async function createStackRemote(stack, options = {}) {\n try {\n return await api(\"/api/stacks\", { method: \"POST\", body: { stack, ...options } });\n } catch (error) {\n if (error instanceof EditorApiError && error.status === 409 && !options.overwrite && confirm((error.message || \"Stack already exists.\") + \"\\n\\nOverwrite it?\")) {\n return await api(\"/api/stacks\", { method: \"POST\", body: { stack, ...options, overwrite: true } });\n }\n throw error;\n }\n }\n async function createAndOpenStack(stack, activate, actionLabel, extraOptions = {}) {\n const data = await createStackRemote(stack, { ...extraOptions, activate });\n stacks = data.stacks || stacks;\n selectedId = data.stack?.id || stack.id;\n dirty = false;\n renderDirtyState();\n await selectStack(selectedId, { keepDirty: true });\n const converted = data.importFormat === \"sillytavern\" ? \" from SillyTavern\" : \"\";\n setStatus(actionLabel + converted + \" \" + selectedId, \"success\");\n if (data.importReport) showImportReport(data.importReport, selectedId);\n }\n async function createNewStack() {\n if (dirty && !confirm(\"Discard unsaved changes?\")) return;\n const promptedId = prompt(\"New stack id\", uniqueStackId(\"new-stack\"));\n if (promptedId === null) return;\n const id = sanitizeStackId(promptedId);\n if (!id) throw new Error(\"Stack id must not be empty.\");\n if (id !== promptedId.trim() && !confirm(\"Use stack id '\" + id + \"'?\")) return;\n const promptedName = prompt(\"Stack display name\", \"Default Pi Prompt Mirror\");\n if (promptedName === null) return;\n const stack = defaultNewStack(id, promptedName.trim() || id);\n const activate = stacks.length === 0 || confirm(\"Activate new stack now?\");\n await createAndOpenStack(stack, activate, \"Created\");\n }\n function defaultNewStack(id, name) {\n return {\n schemaVersion: 1,\n type: \"pi-forge.prompt-stack\",\n id,\n name,\n description: \"Recreates Pi's built-in prompt layout with pi-forge slots, exposing tools, guidelines, docs, append-system-prompt, project context, skills, date/cwd, and chat history as movable pieces.\",\n autoActivate: stacks.length === 0,\n mode: \"replace\",\n defaults: {\n syntheticMessagesVisible: false,\n unresolvedMacroPolicy: \"warn\"\n },\n context: {\n allowDuplicateChatHistory: false\n },\n tools: {\n allow: [\"*\"]\n },\n skills: {\n allow: [\"*\"]\n },\n items: [\n {\n kind: \"block\",\n id: \"main-role\",\n name: \"Pi Default Role\",\n enabled: true,\n role: \"system\",\n source: {\n package: \"@earendil-works/pi-coding-agent\",\n file: \"dist/core/system-prompt.js\"\n },\n content: \"You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\"\n },\n {\n kind: \"slot\",\n id: \"tools\",\n name: \"Available Tools\",\n enabled: true,\n role: \"system\",\n slot: \"tools\",\n options: {\n format: \"plain\",\n onlyWithSnippets: true\n }\n },\n {\n kind: \"block\",\n id: \"custom-tools-note\",\n name: \"Custom Tools Note\",\n enabled: true,\n role: \"system\",\n content: \"In addition to the tools above, you may have access to other custom tools depending on the project.\"\n },\n {\n kind: \"slot\",\n id: \"tool-guidelines\",\n name: \"Guidelines\",\n enabled: true,\n role: \"system\",\n slot: \"tool-guidelines\",\n options: {\n format: \"plain\",\n heading: \"Guidelines:\",\n includePiDefaultGuidelines: true,\n piStyle: true\n }\n },\n {\n kind: \"slot\",\n id: \"pi-docs\",\n name: \"Pi Documentation Guidance\",\n enabled: true,\n role: \"system\",\n slot: \"pi-docs\"\n },\n {\n kind: \"slot\",\n id: \"append-system-prompt\",\n name: \"User Append System Prompt\",\n enabled: true,\n role: \"system\",\n slot: \"append-system-prompt\"\n },\n {\n kind: \"slot\",\n id: \"project-context\",\n name: \"Project Context\",\n enabled: true,\n role: \"system\",\n slot: \"project-context\"\n },\n {\n kind: \"slot\",\n id: \"skills\",\n name: \"Available Skills\",\n enabled: true,\n role: \"system\",\n slot: \"skills\",\n options: {\n requireReadTool: true\n }\n },\n {\n kind: \"slot\",\n id: \"date-cwd\",\n name: \"Date and Working Directory\",\n enabled: true,\n role: \"system\",\n slot: \"date-cwd\"\n },\n {\n kind: \"slot\",\n id: \"chat-history\",\n name: \"Chat History\",\n enabled: true,\n slot: \"chat-history\"\n }\n ]\n };\n }\n function showImportReport(report, stackId) {\n showStackModal(\n \"SillyTavern import report\",\n stackId || \"\",\n '<div class=\"modal-toolbar\"><button id=\"copyImportReportBtn\" data-icon=\"\u25A1\" title=\"Copy this import report\">Copy report</button><span class=\"modal-spacer\"></span><span class=\"modal-meta\">Report-only notes; stack changes are already saved.</span></div><pre class=\"preview-text\">' + escapeHtml(report) + \"</pre>\"\n );\n el(\"copyImportReportBtn\").onclick = () => run(async () => {\n await copyTextToClipboard(report);\n setStatus(\"Copied import report\", \"success\");\n });\n }\n async function importStackJson() {\n el(\"importFileInput\").value = \"\";\n el(\"importFileInput\").click();\n }\n async function handleImportFile(event) {\n const file = event.target.files?.[0];\n if (!file) return;\n const text = await file.text();\n const imported = JSON.parse(text);\n if (!imported || typeof imported !== \"object\" || Array.isArray(imported)) throw new Error(\"Imported JSON must be an object.\");\n if (isSillyTavernImport(imported)) {\n const characterId = promptSillyTavernCharacterId(imported);\n if (characterId === null) return;\n const activate2 = confirm(\"Convert and activate imported SillyTavern stack now?\");\n await createAndOpenStack(imported, activate2, \"Imported\", { sourceName: file.name, characterId });\n return;\n }\n const stack = imported;\n if (!stack.id || typeof stack.id !== \"string\") {\n const promptedId = prompt(\"Stack id\", sanitizeStackId(file.name.replace(/\\.json$/i, \"\")));\n if (!promptedId) return;\n stack.id = promptedId.trim();\n }\n if (!Array.isArray(stack.items)) throw new Error(\"Imported stack must contain an items array.\");\n if (!stack.schemaVersion) stack.schemaVersion = 1;\n if (!stack.type) stack.type = \"pi-forge.prompt-stack\";\n const activate = confirm(\"Activate imported stack now?\");\n await createAndOpenStack(stack, activate, \"Imported\");\n }\n function isSillyTavernImport(value) {\n return value && typeof value === \"object\" && !Array.isArray(value) && Array.isArray(value.prompts) && !Array.isArray(value.items);\n }\n function promptSillyTavernCharacterId(value) {\n const ids = Array.isArray(value.prompt_order) ? value.prompt_order.map((entry) => entry && entry.character_id).filter((id) => Number.isInteger(id)) : [];\n const uniqueIds = [...new Set(ids)];\n if (uniqueIds.length <= 1) return void 0;\n const answer = prompt(\"SillyTavern character_id (\" + uniqueIds.join(\", \") + \")\", String(uniqueIds[0]));\n if (answer === null) return null;\n const parsed = Number(answer.trim());\n if (!Number.isInteger(parsed) || !uniqueIds.includes(parsed)) {\n throw new Error(\"Choose one of these character_id values: \" + uniqueIds.join(\", \"));\n }\n return parsed;\n }\n async function forkStack() {\n const source = stackForSubmit();\n const forkId = prompt(\"New fork stack id\", uniqueForkId(source.id || \"stack\"));\n if (!forkId) return;\n const forkName = prompt(\"Fork display name\", (source.name || source.id || \"Prompt stack\") + \" fork\");\n const fork = structuredClone(source);\n fork.id = forkId.trim();\n if (forkName && forkName.trim()) fork.name = forkName;\n fork.autoActivate = false;\n const activate = confirm(\"Activate fork now?\");\n await createAndOpenStack(fork, activate, \"Forked\");\n }\n async function exportStackJson() {\n const stack = stackForSubmit();\n const json = JSON.stringify(stack, null, 2) + \"\\n\";\n const downloaded = downloadTextFile(sanitizeStackId(stack.id || \"prompt-stack\") + \".json\", json, \"application/json\");\n if (downloaded) {\n setStatus(\"Exported \" + (stack.id || \"prompt stack\"), \"success\");\n return;\n }\n await copyTextToClipboard(json);\n setStatus(\"Copied \" + (stack.id || \"prompt stack\") + \" JSON\", \"success\");\n }\n function downloadTextFile(filename, text, type) {\n if (typeof Blob === \"undefined\" || typeof URL === \"undefined\" || !URL.createObjectURL) return false;\n const blob = new Blob([text], { type });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n if (!(\"download\" in link)) {\n URL.revokeObjectURL(url);\n return false;\n }\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n return true;\n }\n function uniqueForkId(baseId) {\n const base = sanitizeStackId(baseId || \"stack\") || \"stack\";\n const existing = new Set(stacks.map((stack) => stack.id));\n let candidate = base + \"-fork\";\n let index = 2;\n while (existing.has(candidate)) candidate = base + \"-fork-\" + index++;\n return candidate;\n }\n function uniqueStackId(baseId) {\n const base = sanitizeStackId(baseId || \"stack\") || \"stack\";\n const existing = new Set(stacks.map((stack) => stack.id));\n let candidate = base;\n let index = 2;\n while (existing.has(candidate)) candidate = base + \"-\" + index++;\n return candidate;\n }\n function sanitizeStackId(value) {\n return String(value || \"\").trim().replace(/[^A-Za-z0-9_-]+/g, \"-\").replace(/-+/g, \"-\").replace(/^-|-$/g, \"\").toLowerCase();\n }\n async function activateStack() {\n if (!currentStack) return;\n const data = await api(\"/api/stacks/\" + encodeURIComponent(selectedId) + \"/activate\", { method: \"POST\" });\n stacks = data.stacks || stacks;\n renderStackList();\n setStatus(\"Activated \" + selectedId, \"success\");\n }\n async function disableStacks() {\n const data = await api(\"/api/disable\", { method: \"POST\" });\n stacks = data.stacks || stacks;\n renderStackList();\n setStatus(\"Prompt stack disabled\", \"success\");\n }\n async function deleteCurrentStack() {\n if (!currentStack) return;\n const id = selectedId;\n const message = \"Delete prompt stack '\" + id + \"'?\\n\\nThis removes its JSON file from prompt-stack storage.\";\n if (!confirm(message)) return;\n const data = await api(\"/api/stacks/\" + encodeURIComponent(id), { method: \"DELETE\" });\n stacks = data.stacks || [];\n dirty = false;\n renderDirtyState();\n const next = stacks.find((stack) => stack.active) || stacks[0];\n if (next) {\n await selectStack(next.id, { keepDirty: true });\n setStatus(\"Deleted \" + id, \"success\");\n } else {\n renderStackList();\n renderEmpty();\n setStatus(\"Deleted \" + id + \"; no stacks remain\", \"success\");\n }\n }\n async function reloadFromDisk() {\n if (dirty && !confirm(\"Discard unsaved changes?\")) return;\n const data = await api(\"/api/reload\", { method: \"POST\" });\n stacks = data.stacks || [];\n renderStackList();\n await loadStacks(selectedId);\n setStatus(\"Reloaded from disk\", \"success\");\n }\n function stackForSubmit() {\n if (!currentStack) throw new Error(\"No stack selected.\");\n if (optionsError) throw new Error(\"Invalid item options JSON: \" + optionsError);\n if (stackVariablesError) throw new Error(stackVariablesError);\n if (regexEditor.getError()) throw new Error(regexEditor.getError());\n if (policyEditor.getError()) throw new Error(policyEditor.getError());\n const clone = structuredClone(currentStack);\n if (!clone.type) clone.type = \"pi-forge.prompt-stack\";\n if (!clone.schemaVersion) clone.schemaVersion = 1;\n return clone;\n }\n function renderDiagnostics(diagnostics) {\n latestDiagnostics = diagnostics || [];\n const pane = el(\"diagnostics\");\n if (!latestDiagnostics.length) {\n pane.innerHTML = '<div class=\"diagnostic info\">No diagnostics.</div>';\n return;\n }\n pane.innerHTML = latestDiagnostics.map((diag) => {\n const level = diag.level || \"info\";\n const item = diag.itemId ? \" [\" + escapeHtml(diag.itemId) + \"]\" : \"\";\n return '<div class=\"diagnostic ' + attr(level) + '\"><strong>' + escapeHtml(level.toUpperCase()) + item + \"</strong>: \" + escapeHtml(diag.message || \"\") + \"</div>\";\n }).join(\"\");\n }\n function renderEmpty() {\n currentStack = null;\n selectedId = \"\";\n dirty = false;\n activeTab = \"items\";\n policyEditor.reset();\n renderDirtyState();\n document.querySelectorAll(\"[data-tab]\").forEach((button) => {\n button.classList.toggle(\"active\", button.dataset.tab === activeTab);\n });\n el(\"workspace\").style.display = \"\";\n el(\"metadataPanel\").style.display = \"none\";\n el(\"settings\").innerHTML = \"\";\n el(\"itemCount\").textContent = \"\";\n el(\"itemList\").innerHTML = \"\";\n el(\"itemEditor\").innerHTML = '<div class=\"empty\"><div class=\"empty-title\">No prompt stacks found.</div><div>Create a stack in this project, or import an existing pi-forge/SillyTavern JSON file.</div><div class=\"empty-actions\"><button id=\"emptyNewStackBtn\" class=\"primary\" data-icon=\"+\" title=\"Create a new prompt stack\">New stack</button><button id=\"emptyImportBtn\" data-icon=\"\u21EA\" title=\"Import pi-forge stack JSON or SillyTavern preset JSON\">Import JSON</button></div></div>';\n el(\"tabPanel\").classList.remove(\"open\");\n el(\"tabPanel\").innerHTML = \"\";\n renderDiagnostics([]);\n el(\"emptyNewStackBtn\").onclick = () => run(createNewStack);\n el(\"emptyImportBtn\").onclick = () => run(importStackJson);\n setStatus(\"No prompt stacks found\");\n updateActionState();\n }\n function field(label, control, className = \"\") {\n return '<div class=\"field ' + className + '\"><label>' + escapeHtml(label) + \"</label>\" + control + \"</div>\";\n }\n function displayItemName(item) {\n if (item.name) return item.name;\n if (item.source && typeof item.source.previousName === \"string\" && item.source.previousName.trim()) return item.source.previousName;\n if (item.kind === \"slot\" && item.slot) return item.slot;\n if (item.kind === \"block\" && item.content) {\n const firstLine = item.content.trim().split(/\\n/)[0]?.trim();\n if (firstLine) return firstLine.length > 46 ? firstLine.slice(0, 43) + \"...\" : firstLine;\n }\n return item.id || \"(unnamed)\";\n }\n function setOptionalString(target, key, value) {\n const trimmed = value.trim();\n if (trimmed) target[key] = value;\n else delete target[key];\n }\n async function run(action) {\n try {\n await action();\n } catch (error) {\n setStatus(error instanceof Error ? error.message : String(error), \"error\");\n }\n }\n function toggleSidebar() {\n sidebarCollapsed = !sidebarCollapsed;\n el(\"shell\").classList.toggle(\"sidebar-collapsed\", sidebarCollapsed);\n el(\"sidebarToggleBtn\").title = sidebarCollapsed ? \"Show prompt stacks sidebar\" : \"Hide prompt stacks sidebar\";\n setStatus(sidebarCollapsed ? \"Prompt stacks sidebar hidden\" : \"Prompt stacks sidebar shown\");\n }\n el(\"sidebarToggleBtn\").onclick = toggleSidebar;\n el(\"themeBtn\").onclick = toggleTheme;\n el(\"newStackBtn\").onclick = () => run(createNewStack);\n el(\"reloadBtn\").onclick = () => run(reloadFromDisk);\n el(\"disableBtn\").onclick = () => run(disableStacks);\n el(\"activateBtn\").onclick = () => run(activateStack);\n el(\"saveBtn\").onclick = () => run(saveStack);\n el(\"validateBtn\").onclick = () => run(validateStack);\n el(\"previewBtn\").onclick = () => run(previewStack);\n el(\"payloadBtn\").onclick = () => run(openPayloadCapture);\n el(\"metadataToggleBtn\").onclick = toggleMetadata;\n document.querySelectorAll(\"[data-tab]\").forEach((button) => {\n button.onclick = () => {\n activeTab = button.dataset.tab || \"items\";\n renderActiveTab();\n hidePreview();\n };\n });\n el(\"forkBtn\").onclick = () => run(forkStack);\n el(\"importBtn\").onclick = () => run(importStackJson);\n el(\"exportBtn\").onclick = () => run(exportStackJson);\n el(\"importFileInput\").onchange = (event) => run(() => handleImportFile(event));\n el(\"deleteStackBtn\").onclick = () => run(deleteCurrentStack);\n el(\"stackModal\").onclick = (event) => {\n if (event.target === el(\"stackModal\") || event.target.closest?.(\"[data-modal-close]\")) {\n closeStackModal();\n }\n };\n el(\"preview\").onclick = (event) => {\n if (event.target === el(\"preview\") || event.target.closest?.(\"[data-preview-close]\")) {\n hidePreview();\n return;\n }\n if (event.target.closest?.(\"[data-payload-arm]\")) {\n event.preventDefault();\n event.stopPropagation();\n run(() => armPayloadCapture(true));\n return;\n }\n if (event.target.closest?.(\"[data-payload-clear]\")) {\n event.preventDefault();\n event.stopPropagation();\n run(clearPayloadCapture);\n return;\n }\n const button = event.target.closest?.(\"[data-copy-index]\");\n if (!button) return;\n event.preventDefault();\n event.stopPropagation();\n run(() => copyPreviewText(Number(button.dataset.copyIndex)));\n };\n el(\"addItemBtn\").onclick = () => addItem(\"block\");\n el(\"addSlotBtn\").onclick = () => addItem(\"slot\");\n el(\"deleteItemBtn\").onclick = deleteSelectedItem;\n document.addEventListener(\"dragover\", handleDocumentItemDragOver);\n document.addEventListener(\"drop\", handleDocumentItemDrop);\n window.onbeforeunload = () => dirty ? \"Unsaved changes\" : void 0;\n window.addEventListener(\"keydown\", handleEditorShortcut);\n function handleEditorShortcut(event) {\n if (event.key === \"Escape\") {\n if (el(\"preview\").classList.contains(\"open\")) hidePreview();\n else if (el(\"stackModal\").classList.contains(\"open\")) closeStackModal();\n return;\n }\n const modifier = event.ctrlKey || event.metaKey;\n if (!modifier || event.altKey) return;\n const key = event.key.toLowerCase();\n if (key === \"n\") {\n event.preventDefault();\n run(createNewStack);\n return;\n }\n if (key === \"s\") {\n event.preventDefault();\n if (currentStack) run(saveStack);\n return;\n }\n if (key === \"enter\" && event.shiftKey) {\n event.preventDefault();\n if (currentStack) run(validateStack);\n return;\n }\n if (key === \"enter\") {\n event.preventDefault();\n if (currentStack) run(previewStack);\n }\n }\n run(async () => {\n await loadStacks();\n await refreshPayloadCapture();\n setInterval(() => run(() => refreshPayloadCapture({ autoOpen: true })), 2e3);\n });\n})();\n";
1
+ export declare const EDITOR_CLIENT_SCRIPT: string;
2
2
  //# sourceMappingURL=client-script.generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-script.generated.d.ts","sourceRoot":"","sources":["../../src/web-editor/client-script.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,oBAAoB,qstGAAihtG,CAAC"}
1
+ {"version":3,"file":"client-script.generated.d.ts","sourceRoot":"","sources":["../../src/web-editor/client-script.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,oBAAoB,EAAE,MAA433X,CAAC"}