@hyperdreamer/pi-webui 1.10.2 → 1.10.3

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",
@@ -54,6 +52,24 @@ export function renderEntryHtml(entry) {
54
52
  </details>
55
53
  `;
56
54
  }
55
+ /**
56
+ * Returns the total count of memories for a workspace-panel badge, or
57
+ * undefined when no badge should be shown (loading, unavailable, error, or
58
+ * zero entries).
59
+ */
60
+ export function memoryBadge(state) {
61
+ if (state.kind !== "data")
62
+ return undefined;
63
+ const total = state.globalEntries.length + state.projectEntries.length;
64
+ return total > 0 ? total : undefined;
65
+ }
66
+ /**
67
+ * Returns true unless the provider has confirmed that memories are
68
+ * unavailable (e.g. older agent runtime without the memory endpoint).
69
+ */
70
+ export function isMemoryPanelVisible(state) {
71
+ return state.kind !== "unavailable";
72
+ }
57
73
  export function defineMemoryPanelElement() {
58
74
  if (typeof customElements !== "undefined" && !customElements.get(memoryPanelTagName)) {
59
75
  customElements.define(memoryPanelTagName, PiWebUiMemoryPanel);
@@ -71,98 +87,50 @@ const _BaseElement = typeof HTMLElement !== "undefined"
71
87
  ? HTMLElement
72
88
  : _noopElementConstructor();
73
89
  class PiWebUiMemoryPanel extends _BaseElement {
74
- contextValue;
75
- state = { kind: "no-workspace" };
90
+ state = { kind: "loading" };
91
+ retry;
76
92
  root;
77
- loadController = new MemoryLoadController({ fetchGlobalMemories, fetchProjectMemories });
78
93
  constructor() {
79
94
  super();
80
95
  this.root = this.attachShadow({ mode: "open" });
81
96
  }
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();
97
+ /** Public setter for the workspace panel context (reserved for WorkspacePanel wiring). */
98
+ set context(_value) {
99
+ // Context is consumed by the plugin contribution (visible/badge/render),
100
+ // not by the panel element itself in the new architecture. Keep the
101
+ // setter so WorkspacePanel can assign it without errors.
96
102
  }
97
- /** Exposed for tests to inject state directly without network calls. */
98
- setState(next) {
99
- this.state = next;
103
+ /** Accept the core-owned memory state and render synchronously. */
104
+ set memoryState(value) {
105
+ this.state = value;
100
106
  this.render();
101
107
  }
108
+ /** Retry callback wired to the core MemoryController. */
109
+ set onRetry(value) {
110
+ this.retry = value;
111
+ }
102
112
  connectedCallback() {
103
113
  this.render();
104
- if (this.contextValue !== undefined) {
105
- void this.loadMemories();
106
- }
107
114
  }
108
115
  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;
116
+ // No timers to clean up — the core controller owns that lifetime.
142
117
  }
143
118
  render() {
144
119
  this.root.innerHTML = `${panelStyles()}${renderPanelState(this.state)}`;
145
120
  this.attachEventListeners();
146
121
  }
147
122
  attachEventListeners() {
123
+ const retry = this.retry;
124
+ if (retry === undefined)
125
+ return;
148
126
  this.root.querySelector("button[data-retry]")?.addEventListener("click", () => {
149
- void this.loadMemories();
127
+ retry();
150
128
  });
151
129
  }
152
130
  }
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
131
  export function renderPanelState(state) {
164
132
  switch (state.kind) {
165
- case "no-workspace":
133
+ case "unavailable":
166
134
  return `<section class="empty">Select a workspace.</section>`;
167
135
  case "loading":
168
136
  return `<section class="viewer"><div class="spinner">Loading memories\u2026</div></section>`;
@@ -173,6 +141,7 @@ export function renderPanelState(state) {
173
141
  </section>`;
174
142
  case "data":
175
143
  return `<section class="viewer">
144
+ ${state.refreshError === undefined ? "" : `<div class="status warning">${escapeHtml(state.refreshError)}</div>`}
176
145
  ${renderMemoryGroupHtml({
177
146
  title: "Global memory",
178
147
  entries: state.globalEntries,
@@ -186,17 +155,19 @@ export function renderPanelState(state) {
186
155
  ? {}
187
156
  : { unavailableMessage: state.projectUnavailableMessage }),
188
157
  })}
158
+ ${state.refreshError === undefined ? "" : `<button class="secondary" data-retry style="margin-top:10px">Retry</button>`}
189
159
  </section>`;
190
160
  }
191
161
  }
192
162
  function renderMemoryGroupHtml(options) {
193
- const unavailable = options.unavailableMessage !== undefined;
163
+ const unavailable = options.unavailableMessage !== undefined && options.entries.length === 0;
164
+ const hasPartialWarning = options.unavailableMessage !== undefined && !unavailable;
194
165
  const count = `${String(options.entries.length)} ${options.entries.length === 1 ? "entry" : "entries"}`;
195
166
  const body = unavailable
196
167
  ? `<p class="memory-group-message unavailable">${escapeHtml(options.unavailableMessage)}</p>`
197
168
  : options.entries.length === 0
198
169
  ? `<p class="memory-group-message">${escapeHtml(options.emptyMessage)}</p>`
199
- : options.entries.map((entry) => renderEntryHtml(entry)).join("");
170
+ : `${hasPartialWarning ? `<p class="memory-group-message warning">${escapeHtml(options.unavailableMessage)}</p>` : ""}${options.entries.map((entry) => renderEntryHtml(entry)).join("")}`;
200
171
  return `
201
172
  <details class="memory-group">
202
173
  <summary>
@@ -228,12 +199,14 @@ function panelStyles() {
228
199
  .memory-group-body { padding: 0 12px 12px; }
229
200
  .memory-group-message { margin: 0; color: var(--pi-muted); }
230
201
  .memory-group-message.unavailable { color: var(--pi-danger); }
202
+ .memory-group-message.warning { color: var(--pi-warning, #d97706); margin-bottom: 8px; }
231
203
  .muted { color: var(--pi-muted); }
232
204
  .spinner { display: flex; align-items: center; gap: 8px; color: var(--pi-muted); }
233
205
  .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
206
  @keyframes spin { to { transform: rotate(360deg); } }
235
207
  .status { border: 1px solid var(--pi-border); border-radius: 8px; padding: 10px; }
236
208
  .status.error { border-color: var(--pi-danger); color: var(--pi-danger); }
209
+ .status.warning { border-color: var(--pi-warning, #d97706); color: var(--pi-warning, #d97706); margin-bottom: 10px; }
237
210
  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
211
  button.secondary { border-color: var(--pi-border); background: var(--pi-surface); color: var(--pi-text); }
239
212
  .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":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAA0B,MAAM,uBAAuB,CAAC;AAGhF,MAAM,2BAA2B,GAAG,8CAA8C,CAAC;AAOnF,MAAM,cAAc,GAAqB;IACvC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAC3C,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;CAC9D,CAAC;AAEF,MAAM,OAAO,sBAAsB;IAGjC,YACmB,QAAgB,EAChB,aAA+B,cAAc;QAD7C,aAAQ,GAAR,QAAQ,CAAQ;QAChB,eAAU,GAAV,UAAU,CAAmC;QAJvD,OAAE,GAAG,kBAAkB,CAAC;IAK9B,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,KAA0B;QACnC,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAChG,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE3D,IAAI,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACnD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;gBAAE,MAAM,OAAO,CAAC,UAAU,CAAC;YAC/D,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;QAEhG,IAAI,OAAO,CAAC,kBAAkB,KAAK,SAAS,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACrF,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,aAAa;gBACb,cAAc,EAAE,EAAE;gBAClB,yBAAyB,EAAE,OAAO,CAAC,kBAAkB,IAAI,2BAA2B;aACrF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,aAAa;gBACb,cAAc,EAAE,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC;aACvE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,aAAa;gBACb,cAAc,EAAE,EAAE;gBAClB,yBAAyB,EAAE,2BAA2B;aACvD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAC9E,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1G,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,WAA+B;QACxD,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QAE/D,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,CAAC;QACnF,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,OAAO;gBACL,aAAa,EAAE,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;gBACnD,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;aAC5C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,kBAAkB,EAAE,2BAA2B;gBAC/C,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC;aAC3B,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,IAAY;QACxC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,IAAY;QAC5C,IAAI,CAAC;YACH,OAAO,eAAe,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AASD,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnG,CAAC"}
@@ -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.3",
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",
@@ -1,55 +0,0 @@
1
- // Generated from pi-webui-plugins/workspace-memory/memoryClient.ts. Do not edit directly.
2
- function isRecord(value) {
3
- return value !== null && typeof value === "object";
4
- }
5
- function parseMemoryEntry(value) {
6
- if (!isRecord(value))
7
- return undefined;
8
- const id = value["id"];
9
- const content = value["content"];
10
- if (typeof id !== "string" || typeof content !== "string")
11
- return undefined;
12
- const entry = { id, content };
13
- const category = value["category"];
14
- if (typeof category === "string")
15
- entry.category = category;
16
- const created = value["created"];
17
- if (typeof created === "string")
18
- entry.created = created;
19
- const last = value["last"];
20
- if (typeof last === "string")
21
- entry.last = last;
22
- const failureReason = value["failureReason"];
23
- if (typeof failureReason === "string")
24
- entry.failureReason = failureReason;
25
- return entry;
26
- }
27
- function parseEntries(data) {
28
- if (!isRecord(data))
29
- throw new Error("Invalid memory API response");
30
- const entries = data["entries"];
31
- if (!Array.isArray(entries))
32
- throw new Error("Invalid memory API response");
33
- const result = [];
34
- for (const raw of entries) {
35
- const parsed = parseMemoryEntry(raw);
36
- if (parsed !== undefined)
37
- result.push(parsed);
38
- }
39
- return result;
40
- }
41
- export async function fetchGlobalMemories() {
42
- const response = await fetch("api/agent-memory/global");
43
- if (!response.ok) {
44
- throw new Error("Failed to load global memories: " + String(response.status));
45
- }
46
- return parseEntries(await response.json());
47
- }
48
- export async function fetchProjectMemories(projectPath) {
49
- const params = new URLSearchParams({ projectPath });
50
- const response = await fetch("api/agent-memory/project?" + String(params));
51
- if (!response.ok) {
52
- throw new Error("Failed to load project memories: " + String(response.status));
53
- }
54
- return parseEntries(await response.json());
55
- }