Let the lead keep notes on how its user works

This commit is contained in:
Ian Gulliver
2026-10-16 10:50:29 -07:00
parent 919e1f8002
commit d6f73a1560
18 changed files with 759 additions and 208 deletions
+1 -1
View File
File diff suppressed because one or more lines are too long
+54 -5
View File
@@ -1,5 +1,5 @@
import { put } from "./api.js";
import { errorText, h, replace, showAlert } from "./dom.js";
import { del, get, put } from "./api.js";
import { errorText, h, replace, showAlert, showConfirm } from "./dom.js";
import { on, state } from "./state.js";
const kinds = [
{ key: "questions", label: "Questions" },
@@ -51,10 +51,59 @@ export function mountSettings(root) {
};
replace(device, h("p", {}, "This browser doesn't show notifications."), button);
};
replace(root, h("div", { class: "settings-view" }, h("h2", {}, "Notifications"), device, prefs));
const off = on("me", renderPrefs);
const notes = h("div", { class: "lead-notes" });
let loads = 0;
const loadNotes = async () => {
const n = ++loads;
let list;
try {
list = await get("/api/me/lead/notes");
}
catch (err) {
replace(notes, h("p", { class: "hint" }, errorText(err)));
return;
}
if (n !== loads) {
return;
}
if (list.length === 0) {
replace(notes, h("p", { class: "hint" }, "Your lead hasn't noted anything about how you work yet."));
return;
}
replace(notes, h("ul", {}, ...list.map((note) => {
const remove = h("button", {}, "delete");
remove.onclick = async () => {
if (!(await showConfirm([h("p", {}, "Delete this note? Your lead stops applying it."), h("p", {}, note.text)], "Delete", true, remove))) {
return;
}
try {
await del("/api/me/lead/notes/{noteId}", { path: { noteId: note.id } });
}
catch (err) {
void showAlert(errorText(err));
}
};
return h("li", {}, h("span", {}, note.text), remove);
})));
};
replace(root, h("div", { class: "settings-view" }, h("h2", {}, "Notifications"), device, prefs, h("h2", {}, "What your lead has learned"), h("p", { class: "hint" }, "Your lead notes your priorities and preferences as it works with you, and starts every session with them."), notes));
const offs = [
on("me", renderPrefs),
on("event", (detail) => {
const ev = detail;
if (ev.kind === "lead.note_saved" || ev.kind === "lead.note_deleted") {
void loadNotes();
}
}),
];
renderPrefs();
renderDevice();
return off;
void loadNotes();
return () => {
loads++;
for (const off of offs) {
off();
}
};
}
//# sourceMappingURL=settings.js.map
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
+84
View File
@@ -71,6 +71,41 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/me/lead/notes": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** @description What the calling user's lead agent has noted about how they work, oldest first. The lead keeps them with its remember and forget tools. */
get: operations["listLeadNotes"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/me/lead/notes/{noteId}": {
parameters: {
query?: never;
header?: never;
path: {
noteId: string;
};
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete: operations["deleteLeadNote"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/me/focus": {
parameters: {
query?: never;
@@ -1236,6 +1271,14 @@ export interface components {
tabs: components["schemas"]["TaskTab"][];
tab: components["schemas"]["TaskTab"];
};
LeadNote: {
id: string;
text: string;
/** Format: date-time */
created_at: string;
/** Format: date-time */
updated_at: string;
};
PaneFocus: {
/** @description True while the browser window has focus and the focused element is inside the right pane. */
focused: boolean;
@@ -1458,6 +1501,47 @@ export interface operations {
400: components["responses"]["Error"];
};
};
listLeadNotes: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description The notes. */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["LeadNote"][];
};
};
};
};
deleteLeadNote: {
parameters: {
query?: never;
header?: never;
path: {
noteId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Deleted. */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
404: components["responses"]["Error"];
};
};
getFocus: {
parameters: {
query?: never;
+1
View File
@@ -20,6 +20,7 @@ export type Snapshot = Schemas["Snapshot"];
export type Participant = Schemas["Participant"];
export type Focus = Schemas["Focus"];
export type TaskTab = Schemas["TaskTab"];
export type LeadNote = Schemas["LeadNote"];
type Method = "get" | "post" | "put" | "delete";
+72 -5
View File
@@ -1,5 +1,5 @@
import { put, type NotificationPrefs } from "./api.js";
import { errorText, h, replace, showAlert } from "./dom.js";
import { del, get, put, type ByreEvent, type LeadNote, type NotificationPrefs } from "./api.js";
import { errorText, h, replace, showAlert, showConfirm } from "./dom.js";
import { on, state } from "./state.js";
const kinds: { key: keyof NotificationPrefs; label: string }[] = [
@@ -60,10 +60,77 @@ export function mountSettings(root: HTMLElement): () => void {
replace(device, h("p", {}, "This browser doesn't show notifications."), button);
};
replace(root, h("div", { class: "settings-view" }, h("h2", {}, "Notifications"), device, prefs));
const off = on("me", renderPrefs);
const notes = h("div", { class: "lead-notes" });
let loads = 0;
const loadNotes = async () => {
const n = ++loads;
let list: LeadNote[];
try {
list = await get("/api/me/lead/notes");
} catch (err) {
replace(notes, h("p", { class: "hint" }, errorText(err)));
return;
}
if (n !== loads) {
return;
}
if (list.length === 0) {
replace(notes, h("p", { class: "hint" }, "Your lead hasn't noted anything about how you work yet."));
return;
}
replace(
notes,
h(
"ul",
{},
...list.map((note) => {
const remove = h("button", {}, "delete");
remove.onclick = async () => {
if (!(await showConfirm([h("p", {}, "Delete this note? Your lead stops applying it."), h("p", {}, note.text)], "Delete", true, remove))) {
return;
}
try {
await del("/api/me/lead/notes/{noteId}", { path: { noteId: note.id } });
} catch (err) {
void showAlert(errorText(err));
}
};
return h("li", {}, h("span", {}, note.text), remove);
}),
),
);
};
replace(
root,
h(
"div",
{ class: "settings-view" },
h("h2", {}, "Notifications"),
device,
prefs,
h("h2", {}, "What your lead has learned"),
h("p", { class: "hint" }, "Your lead notes your priorities and preferences as it works with you, and starts every session with them."),
notes,
),
);
const offs = [
on("me", renderPrefs),
on("event", (detail) => {
const ev = detail as ByreEvent;
if (ev.kind === "lead.note_saved" || ev.kind === "lead.note_deleted") {
void loadNotes();
}
}),
];
renderPrefs();
renderDevice();
void loadNotes();
return off;
return () => {
loads++;
for (const off of offs) {
off();
}
};
}
+29
View File
@@ -2210,6 +2210,35 @@ button.danger-primary {
accent-color: var(--accent);
}
.lead-notes ul {
margin: 0;
padding: 0;
list-style: none;
}
.lead-notes li {
display: flex;
gap: 12px;
align-items: baseline;
padding: 6px 0;
border-top: 1px solid var(--border);
}
.lead-notes li span {
flex: 1;
}
.lead-notes button {
padding: 0;
border: none;
background: none;
color: var(--accent);
}
.lead-notes button:hover {
text-decoration: underline;
}
.fatal {
padding: 24px;
color: var(--danger);