@hyperdreamer/pi-webui 1.10.2 → 1.10.4

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.
@@ -53,7 +53,7 @@
53
53
  html, body { margin: 0; height: 100%; overflow: hidden; background: var(--pi-bg); color: var(--pi-text); }
54
54
  body { min-height: 100dvh; }
55
55
  </style>
56
- <script type="module" crossorigin src="./assets/index-Bq-PmNe2.js"></script>
56
+ <script type="module" crossorigin src="./assets/index-BB7O_b10.js"></script>
57
57
  <link rel="modulepreload" crossorigin href="./assets/vendor-editor-core-vUi74DnD.js">
58
58
  <link rel="modulepreload" crossorigin href="./assets/vendor-editor-languages-DoaXUodB.js">
59
59
  <link rel="modulepreload" crossorigin href="./assets/vendor-terminal-D8k4UKM2.js">
@@ -1,6 +1,4 @@
1
1
  // Generated from pi-webui-plugins/workspace-memory/memoryPanelElement.ts. Do not edit directly.
2
- import { fetchGlobalMemories, fetchProjectMemories } from "./memoryClient.js";
3
- import { MemoryLoadController } from "./memoryLoadController.js";
4
2
  export const memoryPanelTagName = "pi-webui-memory-panel";
5
3
  const CATEGORY_CLASS = {
6
4
  "tool-quirk": "cat-amber",
@@ -11,6 +9,7 @@ const CATEGORY_CLASS = {
11
9
  convention: "cat-teal",
12
10
  };
13
11
  const TRUNCATE_LENGTH = 120;
12
+ const MEMORY_GROUP_SELECTOR = "details.memory-group";
14
13
  export function categoryBadgeLabel(category) {
15
14
  return category ?? "uncategorized";
16
15
  }
@@ -54,6 +53,24 @@ export function renderEntryHtml(entry) {
54
53
  </details>
55
54
  `;
56
55
  }
56
+ /**
57
+ * Returns the total count of memories for a workspace-panel badge, or
58
+ * undefined when no badge should be shown (loading, unavailable, error, or
59
+ * zero entries).
60
+ */
61
+ export function memoryBadge(state) {
62
+ if (state.kind !== "data")
63
+ return undefined;
64
+ const total = state.globalEntries.length + state.projectEntries.length;
65
+ return total > 0 ? total : undefined;
66
+ }
67
+ /**
68
+ * Returns true unless the provider has confirmed that memories are
69
+ * unavailable (e.g. older agent runtime without the memory endpoint).
70
+ */
71
+ export function isMemoryPanelVisible(state) {
72
+ return state.kind !== "unavailable";
73
+ }
57
74
  export function defineMemoryPanelElement() {
58
75
  if (typeof customElements !== "undefined" && !customElements.get(memoryPanelTagName)) {
59
76
  customElements.define(memoryPanelTagName, PiWebUiMemoryPanel);
@@ -71,98 +88,62 @@ const _BaseElement = typeof HTMLElement !== "undefined"
71
88
  ? HTMLElement
72
89
  : _noopElementConstructor();
73
90
  class PiWebUiMemoryPanel extends _BaseElement {
74
- contextValue;
75
- state = { kind: "no-workspace" };
91
+ state = { kind: "loading" };
92
+ retry;
76
93
  root;
77
- loadController = new MemoryLoadController({ fetchGlobalMemories, fetchProjectMemories });
78
94
  constructor() {
79
95
  super();
80
96
  this.root = this.attachShadow({ mode: "open" });
81
97
  }
82
- /** Public setter for the workspace panel context. */
83
- set context(value) {
84
- const previousContext = this.contextValue;
85
- this.contextValue = value;
86
- if (isSameWorkspaceContext(previousContext, value))
87
- return;
88
- this.loadController.invalidate();
89
- if (value === undefined) {
90
- this.state = { kind: "no-workspace" };
91
- this.render();
92
- return;
93
- }
94
- if (this.isConnected)
95
- void this.loadMemories();
98
+ /** Public setter for the workspace panel context (reserved for WorkspacePanel wiring). */
99
+ set context(_value) {
100
+ // Context is consumed by the plugin contribution (visible/badge/render),
101
+ // not by the panel element itself in the new architecture. Keep the
102
+ // setter so WorkspacePanel can assign it without errors.
96
103
  }
97
- /** Exposed for tests to inject state directly without network calls. */
98
- setState(next) {
99
- this.state = next;
104
+ /** Accept the core-owned memory state and render synchronously. */
105
+ set memoryState(value) {
106
+ if (this.state === value)
107
+ return;
108
+ this.state = value;
100
109
  this.render();
101
110
  }
111
+ /** Retry callback wired to the core MemoryController. */
112
+ set onRetry(value) {
113
+ this.retry = value;
114
+ }
102
115
  connectedCallback() {
103
116
  this.render();
104
- if (this.contextValue !== undefined) {
105
- void this.loadMemories();
106
- }
107
117
  }
108
118
  disconnectedCallback() {
109
- this.loadController.invalidate();
110
- }
111
- async loadMemories() {
112
- const context = this.contextValue;
113
- if (context === undefined) {
114
- this.state = { kind: "no-workspace" };
115
- this.render();
116
- return;
117
- }
118
- const workspacePath = context.workspace.path;
119
- this.state = { kind: "loading" };
120
- this.render();
121
- const result = await this.loadController.load(workspacePath);
122
- if (result === undefined || !this.isCurrentContext(context, workspacePath))
123
- return;
124
- this.state = result.kind === "global-error"
125
- ? { kind: "error", message: result.message }
126
- : {
127
- kind: "data",
128
- globalEntries: result.globalEntries,
129
- projectEntries: result.projectEntries,
130
- ...(result.projectUnavailableMessage === undefined
131
- ? {}
132
- : { projectUnavailableMessage: result.projectUnavailableMessage }),
133
- };
134
- this.render();
135
- context.host.requestRender();
136
- }
137
- isCurrentContext(context, workspacePath) {
138
- const currentContext = this.contextValue;
139
- return currentContext !== undefined
140
- && hasSameWorkspaceIdentity(currentContext, context)
141
- && currentContext.workspace.path === workspacePath;
119
+ // No timers to clean up — the core controller owns that lifetime.
142
120
  }
143
121
  render() {
144
- this.root.innerHTML = `${panelStyles()}${renderPanelState(this.state)}`;
122
+ const expandedGroups = this.expandedMemoryGroups();
123
+ this.root.innerHTML = `${panelStyles()}${renderPanelState(this.state, expandedGroups)}`;
145
124
  this.attachEventListeners();
146
125
  }
126
+ expandedMemoryGroups() {
127
+ const expanded = new Set();
128
+ for (const group of this.root.querySelectorAll(MEMORY_GROUP_SELECTOR)) {
129
+ const scope = group.dataset["memoryGroup"];
130
+ if (group.open && isMemoryGroupScope(scope))
131
+ expanded.add(scope);
132
+ }
133
+ return expanded;
134
+ }
147
135
  attachEventListeners() {
136
+ const retry = this.retry;
137
+ if (retry === undefined)
138
+ return;
148
139
  this.root.querySelector("button[data-retry]")?.addEventListener("click", () => {
149
- void this.loadMemories();
140
+ retry();
150
141
  });
151
142
  }
152
143
  }
153
- function isSameWorkspaceContext(left, right) {
154
- if (left === undefined || right === undefined)
155
- return left === right;
156
- return hasSameWorkspaceIdentity(left, right) && left.workspace.path === right.workspace.path;
157
- }
158
- function hasSameWorkspaceIdentity(left, right) {
159
- return left.machine.id === right.machine.id
160
- && left.workspace.projectId === right.workspace.projectId
161
- && left.workspace.id === right.workspace.id;
162
- }
163
- export function renderPanelState(state) {
144
+ export function renderPanelState(state, expandedGroups = new Set()) {
164
145
  switch (state.kind) {
165
- case "no-workspace":
146
+ case "unavailable":
166
147
  return `<section class="empty">Select a workspace.</section>`;
167
148
  case "loading":
168
149
  return `<section class="viewer"><div class="spinner">Loading memories\u2026</div></section>`;
@@ -173,32 +154,39 @@ export function renderPanelState(state) {
173
154
  </section>`;
174
155
  case "data":
175
156
  return `<section class="viewer">
157
+ ${state.refreshError === undefined ? "" : `<div class="status warning">${escapeHtml(state.refreshError)}</div>`}
176
158
  ${renderMemoryGroupHtml({
159
+ scope: "global",
177
160
  title: "Global memory",
178
161
  entries: state.globalEntries,
179
162
  emptyMessage: "No global memories found.",
163
+ open: expandedGroups.has("global"),
180
164
  })}
181
165
  ${renderMemoryGroupHtml({
166
+ scope: "project",
182
167
  title: "Project-specific memory",
183
168
  entries: state.projectEntries,
184
169
  emptyMessage: "No project-specific memories found.",
170
+ open: expandedGroups.has("project"),
185
171
  ...(state.projectUnavailableMessage === undefined
186
172
  ? {}
187
173
  : { unavailableMessage: state.projectUnavailableMessage }),
188
174
  })}
175
+ ${state.refreshError === undefined ? "" : `<button class="secondary" data-retry style="margin-top:10px">Retry</button>`}
189
176
  </section>`;
190
177
  }
191
178
  }
192
179
  function renderMemoryGroupHtml(options) {
193
- const unavailable = options.unavailableMessage !== undefined;
180
+ const unavailable = options.unavailableMessage !== undefined && options.entries.length === 0;
181
+ const hasPartialWarning = options.unavailableMessage !== undefined && !unavailable;
194
182
  const count = `${String(options.entries.length)} ${options.entries.length === 1 ? "entry" : "entries"}`;
195
183
  const body = unavailable
196
184
  ? `<p class="memory-group-message unavailable">${escapeHtml(options.unavailableMessage)}</p>`
197
185
  : options.entries.length === 0
198
186
  ? `<p class="memory-group-message">${escapeHtml(options.emptyMessage)}</p>`
199
- : options.entries.map((entry) => renderEntryHtml(entry)).join("");
187
+ : `${hasPartialWarning ? `<p class="memory-group-message warning">${escapeHtml(options.unavailableMessage)}</p>` : ""}${options.entries.map((entry) => renderEntryHtml(entry)).join("")}`;
200
188
  return `
201
- <details class="memory-group">
189
+ <details class="memory-group" data-memory-group="${options.scope}"${options.open ? " open" : ""}>
202
190
  <summary>
203
191
  <svg class="memory-group-chevron" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="m9 18 6-6-6-6"></path></svg>
204
192
  <span class="memory-group-title">${escapeHtml(options.title)}</span>
@@ -208,6 +196,9 @@ function renderMemoryGroupHtml(options) {
208
196
  </details>
209
197
  `;
210
198
  }
199
+ function isMemoryGroupScope(value) {
200
+ return value === "global" || value === "project";
201
+ }
211
202
  function panelStyles() {
212
203
  return `
213
204
  <style>
@@ -228,12 +219,14 @@ function panelStyles() {
228
219
  .memory-group-body { padding: 0 12px 12px; }
229
220
  .memory-group-message { margin: 0; color: var(--pi-muted); }
230
221
  .memory-group-message.unavailable { color: var(--pi-danger); }
222
+ .memory-group-message.warning { color: var(--pi-warning, #d97706); margin-bottom: 8px; }
231
223
  .muted { color: var(--pi-muted); }
232
224
  .spinner { display: flex; align-items: center; gap: 8px; color: var(--pi-muted); }
233
225
  .spinner::before { content: ""; display: inline-block; width: 16px; height: 16px; border: 2px solid var(--pi-border); border-top-color: var(--pi-accent); border-radius: 50%; animation: spin 0.8s linear infinite; }
234
226
  @keyframes spin { to { transform: rotate(360deg); } }
235
227
  .status { border: 1px solid var(--pi-border); border-radius: 8px; padding: 10px; }
236
228
  .status.error { border-color: var(--pi-danger); color: var(--pi-danger); }
229
+ .status.warning { border-color: var(--pi-warning, #d97706); color: var(--pi-warning, #d97706); margin-bottom: 10px; }
237
230
  button { border: 1px solid var(--pi-accent-border); border-radius: 7px; background: var(--pi-accent); color: var(--pi-bg); cursor: pointer; padding: 6px 10px; font: inherit; }
238
231
  button.secondary { border-color: var(--pi-border); background: var(--pi-surface); color: var(--pi-text); }
239
232
  .memory-entry { border: 1px solid var(--pi-border); border-radius: 8px; margin-bottom: 8px; }
@@ -1,5 +1,11 @@
1
1
  // Generated from pi-webui-plugins/workspace-memory/pi-webui-plugin.ts. Do not edit directly.
2
- import { defineMemoryPanelElement } from "./memoryPanelElement.js";
2
+ import { defineMemoryPanelElement, isMemoryPanelVisible, memoryBadge } from "./memoryPanelElement.js";
3
+ // The core supplies a context compatible with BundledMemoryContext;
4
+ // this is the narrowest boundary type without importing core internals.
5
+ function bundledMemoryContext(context) {
6
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
7
+ return context;
8
+ }
3
9
  const plugin = {
4
10
  apiVersion: 1,
5
11
  name: "Workspace Memory",
@@ -22,7 +28,12 @@ const plugin = {
22
28
  </svg>
23
29
  `,
24
30
  order: 50,
25
- render: (context) => html `<pi-webui-memory-panel .context=${context}></pi-webui-memory-panel>`,
31
+ visible: (context) => isMemoryPanelVisible(bundledMemoryContext(context).state.memory),
32
+ badge: (context) => memoryBadge(bundledMemoryContext(context).state.memory),
33
+ render: (context) => {
34
+ const memory = bundledMemoryContext(context);
35
+ return html `<pi-webui-memory-panel .context=${context} .memoryState=${memory.state.memory} .onRetry=${memory.onRefreshMemory}></pi-webui-memory-panel>`;
36
+ },
26
37
  },
27
38
  ],
28
39
  },
@@ -0,0 +1,34 @@
1
+ export class MemoryCatalog {
2
+ constructor(providers) {
3
+ this.providers = providers;
4
+ }
5
+ async read(projectPath) {
6
+ const results = await Promise.all(this.providers.map(async (provider) => ({ provider, result: await provider.read({ projectPath }) })));
7
+ const globalEntries = [];
8
+ const projectEntries = [];
9
+ let projectUnavailableMessage;
10
+ let hasAvailableProvider = false;
11
+ for (const { provider, result } of results) {
12
+ if (result.kind === "unavailable")
13
+ continue;
14
+ hasAvailableProvider = true;
15
+ globalEntries.push(...namespaceEntries(provider.id, result.globalEntries));
16
+ projectEntries.push(...namespaceEntries(provider.id, result.projectEntries));
17
+ if (projectUnavailableMessage === undefined && result.projectUnavailableMessage !== undefined) {
18
+ projectUnavailableMessage = result.projectUnavailableMessage;
19
+ }
20
+ }
21
+ if (!hasAvailableProvider)
22
+ return { kind: "unavailable" };
23
+ return {
24
+ kind: "data",
25
+ globalEntries,
26
+ projectEntries,
27
+ ...(projectUnavailableMessage === undefined ? {} : { projectUnavailableMessage }),
28
+ };
29
+ }
30
+ }
31
+ function namespaceEntries(providerId, entries) {
32
+ return entries.map((entry) => ({ ...entry, id: `${providerId}:${entry.id}` }));
33
+ }
34
+ //# sourceMappingURL=memoryCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryCatalog.js","sourceRoot":"","sources":["../../../src/server/memory/memoryCatalog.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,aAAa;IACxB,YAA6B,SAAoC;QAApC,cAAS,GAAT,SAAS,CAA2B;IAAG,CAAC;IAErE,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CACrG,CAAC;QACF,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,MAAM,cAAc,GAAkB,EAAE,CAAC;QACzC,IAAI,yBAA6C,CAAC;QAClD,IAAI,oBAAoB,GAAG,KAAK,CAAC;QAEjC,KAAK,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YAC3C,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa;gBAAE,SAAS;YAE5C,oBAAoB,GAAG,IAAI,CAAC;YAC5B,aAAa,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YAC3E,cAAc,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;YAC7E,IAAI,yBAAyB,KAAK,SAAS,IAAI,MAAM,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;gBAC9F,yBAAyB,GAAG,MAAM,CAAC,yBAAyB,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,oBAAoB;YAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAE1D,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,aAAa;YACb,cAAc;YACd,GAAG,CAAC,yBAAyB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,yBAAyB,EAAE,CAAC;SAClF,CAAC;IACJ,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,UAAkB,EAAE,OAAsB;IAClE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,GAAG,UAAU,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memoryProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryProvider.js","sourceRoot":"","sources":["../../../src/server/memory/memoryProvider.ts"],"names":[],"mappings":""}
@@ -1,4 +1,6 @@
1
1
  import { ActiveAgentProfileAccessError, requireActiveAgentProfile } from "../activeAgentProfileProvider.js";
2
+ import { MemoryCatalog } from "./memoryCatalog.js";
3
+ import { PiHermesMemoryProvider } from "./piHermesMemoryProvider.js";
2
4
  import { MemoryService } from "./memoryService.js";
3
5
  export function registerMemoryRoutes(app, agentProfileProvider, prefix) {
4
6
  app.get(`${prefix}/agent-memory/global`, async (request, reply) => {
@@ -35,5 +37,24 @@ export function registerMemoryRoutes(app, agentProfileProvider, prefix) {
35
37
  throw error;
36
38
  }
37
39
  });
40
+ app.get(`${prefix}/agent-memory/snapshot`, async (request, reply) => {
41
+ reply.header("Cache-Control", "no-store");
42
+ const projectPath = request.query.projectPath;
43
+ if (projectPath === undefined || projectPath === "") {
44
+ return reply.code(400).send({ error: "projectPath query parameter is required" });
45
+ }
46
+ try {
47
+ const profile = await requireActiveAgentProfile(agentProfileProvider);
48
+ const catalog = new MemoryCatalog([new PiHermesMemoryProvider(profile.dir)]);
49
+ const response = await catalog.read(projectPath);
50
+ return response;
51
+ }
52
+ catch (error) {
53
+ if (error instanceof ActiveAgentProfileAccessError) {
54
+ return reply.code(503).send({ error: error.message });
55
+ }
56
+ throw error;
57
+ }
58
+ });
38
59
  }
39
60
  //# sourceMappingURL=memoryRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memoryRoutes.js","sourceRoot":"","sources":["../../../src/server/memory/memoryRoutes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,yBAAyB,EAAmC,MAAM,kCAAkC,CAAC;AAC7I,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,UAAU,oBAAoB,CAClC,GAAoB,EACpB,oBAAgD,EAChD,MAAc;IAEd,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAChE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAA0B,EAAE,OAAO,EAAE,CAAC;YACpD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,6BAA6B,EAAE,CAAC;gBACnD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CACL,GAAG,MAAM,uBAAuB,EAChC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;QAE9C,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAA0B,EAAE,OAAO,EAAE,CAAC;YACpD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,6BAA6B,EAAE,CAAC;gBACnD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"memoryRoutes.js","sourceRoot":"","sources":["../../../src/server/memory/memoryRoutes.ts"],"names":[],"mappings":"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"}
@@ -1,44 +1,14 @@
1
- import { readFile } from "node:fs/promises";
2
- import { basename, join } from "node:path";
3
- import { parseMemoryFile } from "./memoryFileParser.js";
1
+ import { PiHermesMemoryProvider } from "./piHermesMemoryProvider.js";
4
2
  export class MemoryService {
5
3
  constructor(agentDir) {
6
- this.agentDir = agentDir;
4
+ this.provider = new PiHermesMemoryProvider(agentDir);
7
5
  }
8
6
  async globalEntries() {
9
- const results = [];
10
- const memPath = join(this.agentDir, "pi-hermes-memory", "MEMORY.md");
11
- try {
12
- const content = await readFile(memPath, "utf-8");
13
- results.push(...parseMemoryFile(content));
14
- }
15
- catch {
16
- // File missing — skip
17
- }
18
- const failuresPath = join(this.agentDir, "pi-hermes-memory", "failures.md");
19
- try {
20
- const content = await readFile(failuresPath, "utf-8");
21
- results.push(...parseMemoryFile(content));
22
- }
23
- catch {
24
- // File missing — skip
25
- }
26
- return results;
7
+ const result = await this.provider.read({});
8
+ return result.kind === "data" ? result.globalEntries : [];
27
9
  }
28
10
  async projectEntries(projectPath) {
29
- const projectName = basename(projectPath);
30
- // Path safety: reject names that could escape the projects-memory directory
31
- if (projectName.includes("/") || projectName.includes("\\") || projectName === ".." || projectName === ".") {
32
- return [];
33
- }
34
- const filePath = join(this.agentDir, "projects-memory", projectName, "MEMORY.md");
35
- try {
36
- const content = await readFile(filePath, "utf-8");
37
- return parseMemoryFile(content);
38
- }
39
- catch {
40
- return [];
41
- }
11
+ return this.provider.readProjectEntries(projectPath);
42
12
  }
43
13
  }
44
14
  //# sourceMappingURL=memoryService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memoryService.js","sourceRoot":"","sources":["../../../src/server/memory/memoryService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAA0B,MAAM,uBAAuB,CAAC;AAEhF,MAAM,OAAO,aAAa;IACxB,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,KAAK,CAAC,aAAa;QACjB,MAAM,OAAO,GAAwB,EAAE,CAAC;QAExC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE1C,4EAA4E;QAC5E,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;YAC3G,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAClF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"memoryService.js","sourceRoot":"","sources":["../../../src/server/memory/memoryService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,OAAO,aAAa;IAGxB,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -0,0 +1,118 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ import { parseMemoryFile } from "./memoryFileParser.js";
4
+ const PROJECT_UNAVAILABLE_MESSAGE = "Project-specific memory could not be loaded.";
5
+ const nodeFileAccess = {
6
+ readFile: (path) => readFile(path, "utf-8"),
7
+ isDirectory: async (path) => (await stat(path)).isDirectory(),
8
+ };
9
+ export class PiHermesMemoryProvider {
10
+ constructor(agentDir, fileAccess = nodeFileAccess) {
11
+ this.agentDir = agentDir;
12
+ this.fileAccess = fileAccess;
13
+ this.id = "pi-hermes-memory";
14
+ }
15
+ async read(input) {
16
+ const globalRootAvailable = await this.directoryExists(join(this.agentDir, "pi-hermes-memory"));
17
+ const project = await this.projectScope(input.projectPath);
18
+ if (!globalRootAvailable && !project.rootAvailable) {
19
+ if (project.probeError !== undefined)
20
+ throw project.probeError;
21
+ return { kind: "unavailable" };
22
+ }
23
+ const globalEntries = await this.globalEntries();
24
+ if (input.projectPath === undefined)
25
+ return { kind: "data", globalEntries, projectEntries: [] };
26
+ if (project.unavailableMessage !== undefined || project.memoryFilePath === undefined) {
27
+ return {
28
+ kind: "data",
29
+ globalEntries,
30
+ projectEntries: [],
31
+ projectUnavailableMessage: project.unavailableMessage ?? PROJECT_UNAVAILABLE_MESSAGE,
32
+ };
33
+ }
34
+ try {
35
+ return {
36
+ kind: "data",
37
+ globalEntries,
38
+ projectEntries: await this.readOptionalEntries(project.memoryFilePath),
39
+ };
40
+ }
41
+ catch {
42
+ return {
43
+ kind: "data",
44
+ globalEntries,
45
+ projectEntries: [],
46
+ projectUnavailableMessage: PROJECT_UNAVAILABLE_MESSAGE,
47
+ };
48
+ }
49
+ }
50
+ async readProjectEntries(projectPath) {
51
+ const project = await this.projectScope(projectPath);
52
+ if (!project.rootAvailable || project.memoryFilePath === undefined)
53
+ return [];
54
+ try {
55
+ return await this.readOptionalEntries(project.memoryFilePath);
56
+ }
57
+ catch {
58
+ return [];
59
+ }
60
+ }
61
+ async globalEntries() {
62
+ const memoryPath = join(this.agentDir, "pi-hermes-memory", "MEMORY.md");
63
+ const failuresPath = join(this.agentDir, "pi-hermes-memory", "failures.md");
64
+ return [...await this.readOptionalEntries(memoryPath), ...await this.readOptionalEntries(failuresPath)];
65
+ }
66
+ async projectScope(projectPath) {
67
+ if (projectPath === undefined)
68
+ return { rootAvailable: false };
69
+ const projectName = basename(projectPath);
70
+ if (isUnsafeProjectName(projectName)) {
71
+ return { rootAvailable: false, unavailableMessage: PROJECT_UNAVAILABLE_MESSAGE };
72
+ }
73
+ const rootPath = join(this.agentDir, "projects-memory", projectName);
74
+ try {
75
+ return {
76
+ rootAvailable: await this.directoryExists(rootPath),
77
+ memoryFilePath: join(rootPath, "MEMORY.md"),
78
+ };
79
+ }
80
+ catch (error) {
81
+ return {
82
+ rootAvailable: false,
83
+ unavailableMessage: PROJECT_UNAVAILABLE_MESSAGE,
84
+ probeError: toError(error),
85
+ };
86
+ }
87
+ }
88
+ async directoryExists(path) {
89
+ try {
90
+ return await this.fileAccess.isDirectory(path);
91
+ }
92
+ catch (error) {
93
+ if (isEnoent(error))
94
+ return false;
95
+ throw error;
96
+ }
97
+ }
98
+ async readOptionalEntries(path) {
99
+ try {
100
+ return parseMemoryFile(await this.fileAccess.readFile(path));
101
+ }
102
+ catch (error) {
103
+ if (isEnoent(error))
104
+ return [];
105
+ throw error;
106
+ }
107
+ }
108
+ }
109
+ function toError(error) {
110
+ return error instanceof Error ? error : new Error(String(error));
111
+ }
112
+ function isUnsafeProjectName(name) {
113
+ return name === "." || name === ".." || name.includes("/") || name.includes("\\");
114
+ }
115
+ function isEnoent(error) {
116
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
117
+ }
118
+ //# sourceMappingURL=piHermesMemoryProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piHermesMemoryProvider.js","sourceRoot":"","sources":["../../../src/server/memory/piHermesMemoryProvider.ts"],"names":[],"mappings":"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"}
@@ -1225,6 +1225,14 @@ export interface MemoryEntry {
1225
1225
  last?: string;
1226
1226
  failureReason?: string;
1227
1227
  }
1228
+ export type MemorySnapshotResponse = {
1229
+ kind: "unavailable";
1230
+ } | {
1231
+ kind: "data";
1232
+ globalEntries: MemoryEntry[];
1233
+ projectEntries: MemoryEntry[];
1234
+ projectUnavailableMessage?: string;
1235
+ };
1228
1236
  export interface MemoryEntriesResponse {
1229
1237
  entries: MemoryEntry[];
1230
1238
  }
@@ -14,6 +14,7 @@ export const FEDERATED_HTTP_ROUTES = [
14
14
  { method: "POST", path: "/models-config/discover" },
15
15
  { method: "GET", path: "/session-defaults" },
16
16
  { method: "PUT", path: "/session-defaults" },
17
+ { method: "GET", path: "/agent-memory/snapshot" },
17
18
  { method: "GET", path: "/skills" },
18
19
  { method: "PATCH", path: "/skills" },
19
20
  { method: "POST", path: "/skills/search", timeoutMs: SKILLS_OPERATION_PROXY_TIMEOUT_MS },
@@ -1 +1 @@
1
- {"version":3,"file":"federatedRoutes.js","sourceRoot":"","sources":["../../src/shared/federatedRoutes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"federatedRoutes.js","sourceRoot":"","sources":["../../src/shared/federatedRoutes.ts"],"names":[],"mappings":"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"}
package/docs/plugins.md CHANGED
@@ -208,6 +208,8 @@ Built-in plugins can be managed from **Settings → PI WEBUI plugins** or with t
208
208
 
209
209
  The tab shows independently collapsible **Global memory** and **Project-specific memory** groups. Project-specific memory contains entries only for the selected workspace project. Empty or missing memory data appears as a scoped empty state. An unavailable project-specific request displays a scoped **Project-specific unavailable** state while **Global memory** remains available. A failed global-memory request is presented as a panel-level retryable error.
210
210
 
211
+ The Memory tab is visible only when a compatible memory provider is detected for the active agent profile and project scope. A compatible provider with zero entries still shows the tab but omits the badge. A positive badge totals global and project-specific memory entries. PI WEBUI refreshes the badge immediately after a selected project or workspace change and then checks approximately every 30 seconds. This is polling; PI WEBUI does not promise instant or realtime updates.
212
+
211
213
  Memory is bundled with PI WEBUI and enabled by default. To disable it, use **Settings → PI WEBUI plugins** or set:
212
214
 
213
215
  ```json
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperdreamer/pi-webui",
3
- "version": "1.10.2",
3
+ "version": "1.10.4",
4
4
  "description": "Web UI for persistent Pi Coding Agent sessions in real workspaces.",
5
5
  "license": "MIT",
6
6
  "author": "Federico Jaramillo Martinez and HyperDreamer",