@batalabs/virlow-mcp-core 3.18.0 → 3.68.0
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.
- package/LICENSE +8 -18
- package/README.md +1 -1
- package/dist/api.d.ts +32 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +38 -5
- package/dist/api.js.map +1 -1
- package/dist/attrs-extract.d.ts +48 -0
- package/dist/attrs-extract.d.ts.map +1 -0
- package/dist/attrs-extract.js +153 -0
- package/dist/attrs-extract.js.map +1 -0
- package/dist/attrs.d.ts +445 -0
- package/dist/attrs.d.ts.map +1 -0
- package/dist/attrs.js +604 -0
- package/dist/attrs.js.map +1 -0
- package/dist/cjs/api.d.ts +32 -0
- package/dist/cjs/api.js +38 -5
- package/dist/cjs/attrs-extract.d.ts +47 -0
- package/dist/cjs/attrs-extract.js +159 -0
- package/dist/cjs/attrs.d.ts +444 -0
- package/dist/cjs/attrs.js +635 -0
- package/dist/cjs/index.d.ts +5 -1
- package/dist/cjs/index.js +22 -1
- package/dist/cjs/memories.d.ts +79 -1
- package/dist/cjs/memories.js +249 -15
- package/dist/cjs/memory-graph.d.ts +105 -0
- package/dist/cjs/memory-graph.js +270 -0
- package/dist/cjs/memory-note.d.ts +57 -0
- package/dist/cjs/memory-note.js +174 -10
- package/dist/cjs/memory-secrets.d.ts +19 -0
- package/dist/cjs/memory-secrets.js +108 -0
- package/dist/cjs/notes.d.ts +208 -2
- package/dist/cjs/notes.js +721 -12
- package/dist/http/index.d.ts +4 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +3 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/local-origin.d.ts +61 -0
- package/dist/http/local-origin.d.ts.map +1 -0
- package/dist/http/local-origin.js +92 -0
- package/dist/http/local-origin.js.map +1 -0
- package/dist/http/server.d.ts +39 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +131 -0
- package/dist/http/server.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/memories.d.ts +79 -1
- package/dist/memories.d.ts.map +1 -1
- package/dist/memories.js +249 -15
- package/dist/memories.js.map +1 -1
- package/dist/memory-graph.d.ts +106 -0
- package/dist/memory-graph.d.ts.map +1 -0
- package/dist/memory-graph.js +258 -0
- package/dist/memory-graph.js.map +1 -0
- package/dist/memory-note.d.ts +57 -0
- package/dist/memory-note.d.ts.map +1 -1
- package/dist/memory-note.js +170 -10
- package/dist/memory-note.js.map +1 -1
- package/dist/memory-secrets.d.ts +20 -0
- package/dist/memory-secrets.d.ts.map +1 -0
- package/dist/memory-secrets.js +103 -0
- package/dist/memory-secrets.js.map +1 -0
- package/dist/notes.d.ts +208 -2
- package/dist/notes.d.ts.map +1 -1
- package/dist/notes.js +722 -13
- package/dist/notes.js.map +1 -1
- package/dist/tools.d.ts +8 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +465 -10
- package/dist/tools.js.map +1 -1
- package/package.json +21 -5
package/dist/attrs.js
ADDED
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
import { decryptStringBlob, encryptStringBlob } from '@batalabs/virlow-crypto';
|
|
2
|
+
const FILTER_OPS = ['is', 'has', 'checked', 'unchecked', 'empty', 'notEmpty'];
|
|
3
|
+
export function isPropertyFilter(value) {
|
|
4
|
+
if (!isRecord(value))
|
|
5
|
+
return false;
|
|
6
|
+
if (typeof value.propId !== 'string' || value.propId === '')
|
|
7
|
+
return false;
|
|
8
|
+
if (!FILTER_OPS.includes(value.op))
|
|
9
|
+
return false;
|
|
10
|
+
if (value.op === 'is' || value.op === 'has')
|
|
11
|
+
return typeof value.value === 'string';
|
|
12
|
+
return value.value === undefined;
|
|
13
|
+
}
|
|
14
|
+
/** Whether a value counts as absent. An empty string and an empty list read as
|
|
15
|
+
* nothing to the person looking at the row, so they filter as nothing too. */
|
|
16
|
+
function isEmptyValue(value) {
|
|
17
|
+
if (value === undefined)
|
|
18
|
+
return true;
|
|
19
|
+
switch (value.t) {
|
|
20
|
+
case 'text':
|
|
21
|
+
case 'url':
|
|
22
|
+
case 'select':
|
|
23
|
+
case 'date':
|
|
24
|
+
return value.v === '';
|
|
25
|
+
case 'multiSelect':
|
|
26
|
+
case 'relation':
|
|
27
|
+
return value.v.length === 0;
|
|
28
|
+
case 'number':
|
|
29
|
+
return Number.isNaN(value.v);
|
|
30
|
+
case 'checkbox':
|
|
31
|
+
// A checkbox is never absent: false is an answer, not a blank.
|
|
32
|
+
return false;
|
|
33
|
+
default:
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function matchesFilter(attrs, filter) {
|
|
38
|
+
const value = attrs?.props[filter.propId];
|
|
39
|
+
switch (filter.op) {
|
|
40
|
+
case 'is':
|
|
41
|
+
return value?.t === 'select' && value.v === filter.value;
|
|
42
|
+
case 'has':
|
|
43
|
+
return value?.t === 'multiSelect' && value.v.includes(filter.value);
|
|
44
|
+
case 'checked':
|
|
45
|
+
return value?.t === 'checkbox' && value.v === true;
|
|
46
|
+
case 'unchecked':
|
|
47
|
+
// Unticked and never touched are the same thing to the reader, so a note
|
|
48
|
+
// with no value for the box counts as unchecked rather than dropping out
|
|
49
|
+
// of both halves of the filter.
|
|
50
|
+
return value === undefined || (value.t === 'checkbox' && value.v === false);
|
|
51
|
+
case 'empty':
|
|
52
|
+
return isEmptyValue(value);
|
|
53
|
+
case 'notEmpty':
|
|
54
|
+
return !isEmptyValue(value);
|
|
55
|
+
default:
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Every filter passes. Filters across different properties are an AND: each
|
|
60
|
+
* one narrows what the last one left, which is what picking two of them from
|
|
61
|
+
* a menu looks like it should do. */
|
|
62
|
+
export function matchesAll(attrs, filters) {
|
|
63
|
+
return (filters ?? []).every((filter) => matchesFilter(attrs, filter));
|
|
64
|
+
}
|
|
65
|
+
export function isHomeSort(value) {
|
|
66
|
+
return (isRecord(value) &&
|
|
67
|
+
typeof value.by === 'string' &&
|
|
68
|
+
value.by !== '' &&
|
|
69
|
+
(value.dir === 'asc' || value.dir === 'desc'));
|
|
70
|
+
}
|
|
71
|
+
const PINNED_LOOKS = ['list', 'notes'];
|
|
72
|
+
/** The most notes one pinned block holds. Past this it is a listing, and a
|
|
73
|
+
* table with a filter is the block for a listing. */
|
|
74
|
+
export const PINNED_MAX = 50;
|
|
75
|
+
/** The longest a table block's title may be: a heading, not a description. */
|
|
76
|
+
export const HOME_TITLE_MAX = 60;
|
|
77
|
+
/** The longest a `text` widget may be. A home is a surface, not a document;
|
|
78
|
+
* anything longer belongs in a note. */
|
|
79
|
+
export const HOME_TEXT_MAX = 280;
|
|
80
|
+
/** The longest a `summary` may be. Room for a paragraph or two of context,
|
|
81
|
+
* and short of the point where the dashboard becomes a document. */
|
|
82
|
+
export const HOME_SUMMARY_MAX = 2000;
|
|
83
|
+
const HOME_KINDS = [
|
|
84
|
+
'counts',
|
|
85
|
+
'recent',
|
|
86
|
+
'starred',
|
|
87
|
+
'breakdown',
|
|
88
|
+
'upcoming',
|
|
89
|
+
'text',
|
|
90
|
+
'summary',
|
|
91
|
+
'table',
|
|
92
|
+
'calendar',
|
|
93
|
+
'board',
|
|
94
|
+
'activity',
|
|
95
|
+
'stale',
|
|
96
|
+
'tasks',
|
|
97
|
+
'pinned',
|
|
98
|
+
'quick',
|
|
99
|
+
];
|
|
100
|
+
const SPANS = ['half', 'full'];
|
|
101
|
+
/**
|
|
102
|
+
* A block's width when it has not been given one.
|
|
103
|
+
*
|
|
104
|
+
* A table's columns and a month grid need the room; a stat row and a short
|
|
105
|
+
* list do not, and pairing them is what makes the page read as a dashboard
|
|
106
|
+
* rather than a column of cards.
|
|
107
|
+
*/
|
|
108
|
+
const DEFAULT_SPAN = {
|
|
109
|
+
counts: 'half',
|
|
110
|
+
recent: 'half',
|
|
111
|
+
starred: 'half',
|
|
112
|
+
breakdown: 'half',
|
|
113
|
+
upcoming: 'half',
|
|
114
|
+
text: 'full',
|
|
115
|
+
summary: 'full',
|
|
116
|
+
table: 'full',
|
|
117
|
+
calendar: 'full',
|
|
118
|
+
board: 'full',
|
|
119
|
+
activity: 'half',
|
|
120
|
+
stale: 'half',
|
|
121
|
+
tasks: 'half',
|
|
122
|
+
pinned: 'half',
|
|
123
|
+
quick: 'full',
|
|
124
|
+
};
|
|
125
|
+
export function spanOf(widget) {
|
|
126
|
+
return widget.span ?? DEFAULT_SPAN[widget.kind] ?? 'half';
|
|
127
|
+
}
|
|
128
|
+
/** True for a block this build can draw. Exported so the MCP layer can refuse
|
|
129
|
+
* one at the tool boundary rather than writing it and skipping it on read. */
|
|
130
|
+
export function isHomeWidget(value) {
|
|
131
|
+
if (!isRecord(value))
|
|
132
|
+
return false;
|
|
133
|
+
if (typeof value.id !== 'string')
|
|
134
|
+
return false;
|
|
135
|
+
if (!HOME_KINDS.includes(value.kind))
|
|
136
|
+
return false;
|
|
137
|
+
// An unknown span is dropped rather than rendered at some guessed width.
|
|
138
|
+
if (value.span !== undefined && !SPANS.includes(value.span))
|
|
139
|
+
return false;
|
|
140
|
+
if (value.kind === 'breakdown' ||
|
|
141
|
+
value.kind === 'upcoming' ||
|
|
142
|
+
value.kind === 'calendar' ||
|
|
143
|
+
value.kind === 'board') {
|
|
144
|
+
return typeof value.propId === 'string';
|
|
145
|
+
}
|
|
146
|
+
if (value.kind === 'table' || value.kind === 'tasks') {
|
|
147
|
+
// A malformed filter is refused rather than ignored: a table that silently
|
|
148
|
+
// shows everything is wrong in the way that is hardest to notice.
|
|
149
|
+
if (value.filters !== undefined) {
|
|
150
|
+
if (!Array.isArray(value.filters) || !value.filters.every(isPropertyFilter))
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
if (value.kind === 'table') {
|
|
154
|
+
if (value.sort !== undefined && !isHomeSort(value.sort))
|
|
155
|
+
return false;
|
|
156
|
+
if (value.title !== undefined) {
|
|
157
|
+
if (typeof value.title !== 'string' || value.title.length > HOME_TITLE_MAX)
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
if (value.kind === 'pinned') {
|
|
164
|
+
if (!Array.isArray(value.noteIds) ||
|
|
165
|
+
value.noteIds.length > PINNED_MAX ||
|
|
166
|
+
!value.noteIds.every((id) => typeof id === 'string' && id !== ''))
|
|
167
|
+
return false;
|
|
168
|
+
if (value.look !== undefined && !PINNED_LOOKS.includes(value.look))
|
|
169
|
+
return false;
|
|
170
|
+
if (value.colors !== undefined) {
|
|
171
|
+
if (!isRecord(value.colors))
|
|
172
|
+
return false;
|
|
173
|
+
if (!Object.values(value.colors).every((c) => typeof c === 'string' && c.length <= 24))
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
if (value.kind === 'text')
|
|
179
|
+
return typeof value.body === 'string';
|
|
180
|
+
if (value.kind === 'summary') {
|
|
181
|
+
if (typeof value.body !== 'string')
|
|
182
|
+
return false;
|
|
183
|
+
return value.at === undefined || typeof value.at === 'string';
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* What a workspace shows when nobody has arranged its home.
|
|
189
|
+
*
|
|
190
|
+
* A default rather than an empty screen: a workspace should be worth opening
|
|
191
|
+
* the first time, and these three need no configuration to mean something.
|
|
192
|
+
*/
|
|
193
|
+
export const DEFAULT_HOME_WIDGETS = [
|
|
194
|
+
{ id: 'default-counts', kind: 'counts' },
|
|
195
|
+
{ id: 'default-recent', kind: 'recent', limit: 5 },
|
|
196
|
+
{ id: 'default-starred', kind: 'starred', limit: 5 },
|
|
197
|
+
];
|
|
198
|
+
/**
|
|
199
|
+
* The widgets to draw, dropping any this build cannot read.
|
|
200
|
+
*
|
|
201
|
+
* Mirrors sortedProps: a newer client may write a kind this one does not
|
|
202
|
+
* know, and the right answer is to skip it rather than to throw away the
|
|
203
|
+
* whole home or crash rendering it.
|
|
204
|
+
*/
|
|
205
|
+
/**
|
|
206
|
+
* A home with `widgets` written out in full.
|
|
207
|
+
*
|
|
208
|
+
* The first edit to a workspace that has never been arranged has to write the
|
|
209
|
+
* defaults down alongside the change. Otherwise removing a default block does
|
|
210
|
+
* nothing: homeWidgets would see an empty list, fall back, and put it
|
|
211
|
+
* straight back. Materialising turns "no opinion" into "this arrangement",
|
|
212
|
+
* which is what an edit means.
|
|
213
|
+
*/
|
|
214
|
+
export function withHomeWidgets(schema, widgets) {
|
|
215
|
+
return { ...schema, home: { ...schema.home, widgets } };
|
|
216
|
+
}
|
|
217
|
+
/** A widget id that will not collide with another in the same home. */
|
|
218
|
+
export function newWidgetId() {
|
|
219
|
+
const bytes = crypto.getRandomValues(new Uint8Array(6));
|
|
220
|
+
return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
221
|
+
}
|
|
222
|
+
export function homeWidgets(schema,
|
|
223
|
+
/** The workspace's properties. Given them, an unarranged home leads with a
|
|
224
|
+
* calendar when there is a date property to place notes on. Omitted, the
|
|
225
|
+
* default is the plain three, which is what a caller with no schema to
|
|
226
|
+
* hand should get. */
|
|
227
|
+
defs) {
|
|
228
|
+
const configured = schema?.home?.widgets;
|
|
229
|
+
if (!Array.isArray(configured))
|
|
230
|
+
return defaultWidgets(defs);
|
|
231
|
+
const known = configured.filter(isHomeWidget);
|
|
232
|
+
return known.length > 0 ? known : defaultWidgets(defs);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* What an unarranged workspace shows.
|
|
236
|
+
*
|
|
237
|
+
* A calendar first: dates are what people open a workspace to see, and a
|
|
238
|
+
* month grid answers "what is happening here" in a way three counts cannot.
|
|
239
|
+
*/
|
|
240
|
+
function defaultWidgets(defs) {
|
|
241
|
+
// A workspace's own date property when it has one, and otherwise the notes'
|
|
242
|
+
// edit times, so every workspace opens on a calendar rather than only the
|
|
243
|
+
// ones that have been configured.
|
|
244
|
+
const date = defs?.find((def) => def.type === 'date');
|
|
245
|
+
return [
|
|
246
|
+
{
|
|
247
|
+
id: 'default-calendar',
|
|
248
|
+
kind: 'calendar',
|
|
249
|
+
propId: date ? date.id : LAST_CHANGED,
|
|
250
|
+
},
|
|
251
|
+
...DEFAULT_HOME_WIDGETS,
|
|
252
|
+
];
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Starting arrangements.
|
|
256
|
+
*
|
|
257
|
+
* An empty page is where most people stall: every block exists, and none of
|
|
258
|
+
* them says which six to put together for a project. A preset is that
|
|
259
|
+
* answer written down, built from the workspace's own properties where it
|
|
260
|
+
* has them (a board wants a select, a calendar wants a date) and from the
|
|
261
|
+
* notes' own dates where it does not, so every preset draws something on
|
|
262
|
+
* the workspace it is applied to. Applying one replaces the arrangement,
|
|
263
|
+
* and the one it replaced is kept for undo like any other change.
|
|
264
|
+
*/
|
|
265
|
+
export const HOME_PRESETS = ['project', 'research', 'journal'];
|
|
266
|
+
export const HOME_PRESET_LABELS = {
|
|
267
|
+
project: {
|
|
268
|
+
name: 'Project',
|
|
269
|
+
blurb: 'Open tasks, a board by stage, a calendar, and what has gone quiet.',
|
|
270
|
+
},
|
|
271
|
+
research: {
|
|
272
|
+
name: 'Research',
|
|
273
|
+
blurb: 'Pinned sources, the latest additions, and a calendar of when things arrived.',
|
|
274
|
+
},
|
|
275
|
+
journal: {
|
|
276
|
+
name: 'Journal',
|
|
277
|
+
blurb: 'This week, recent entries, open tasks, and how often you write.',
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
export function isHomePreset(value) {
|
|
281
|
+
return HOME_PRESETS.includes(value);
|
|
282
|
+
}
|
|
283
|
+
export function presetWidgets(preset, defs = [], id = newWidgetId) {
|
|
284
|
+
const select = defs.find((d) => d.type === 'select');
|
|
285
|
+
const date = defs.find((d) => d.type === 'date');
|
|
286
|
+
switch (preset) {
|
|
287
|
+
case 'project':
|
|
288
|
+
return [
|
|
289
|
+
{ id: id(), kind: 'tasks', limit: 10, span: 'half' },
|
|
290
|
+
{ id: id(), kind: 'counts', span: 'half' },
|
|
291
|
+
select
|
|
292
|
+
? { id: id(), kind: 'board', propId: select.id, span: 'full' }
|
|
293
|
+
: { id: id(), kind: 'table', limit: 10, span: 'full' },
|
|
294
|
+
{ id: id(), kind: 'calendar', propId: date ? date.id : LAST_CHANGED, span: 'full' },
|
|
295
|
+
{ id: id(), kind: 'pinned', noteIds: [], look: 'notes', span: 'half' },
|
|
296
|
+
{ id: id(), kind: 'stale', days: 30, limit: 5, span: 'half' },
|
|
297
|
+
];
|
|
298
|
+
case 'research':
|
|
299
|
+
return [
|
|
300
|
+
{ id: id(), kind: 'pinned', noteIds: [], look: 'notes', span: 'half' },
|
|
301
|
+
{ id: id(), kind: 'recent', limit: 10, span: 'half' },
|
|
302
|
+
{
|
|
303
|
+
id: id(),
|
|
304
|
+
kind: 'table',
|
|
305
|
+
title: 'Latest additions',
|
|
306
|
+
limit: 10,
|
|
307
|
+
sort: { by: CREATED, dir: 'desc' },
|
|
308
|
+
span: 'full',
|
|
309
|
+
},
|
|
310
|
+
select
|
|
311
|
+
? { id: id(), kind: 'breakdown', propId: select.id, span: 'half' }
|
|
312
|
+
: { id: id(), kind: 'activity', weeks: 12, span: 'half' },
|
|
313
|
+
{ id: id(), kind: 'tasks', limit: 10, span: 'half' },
|
|
314
|
+
{ id: id(), kind: 'calendar', propId: CREATED, span: 'full' },
|
|
315
|
+
];
|
|
316
|
+
case 'journal':
|
|
317
|
+
return [
|
|
318
|
+
{ id: id(), kind: 'quick', span: 'full' },
|
|
319
|
+
{ id: id(), kind: 'calendar', propId: LAST_CHANGED, range: 'week', span: 'full' },
|
|
320
|
+
{ id: id(), kind: 'recent', limit: 7, span: 'half' },
|
|
321
|
+
{ id: id(), kind: 'tasks', limit: 10, span: 'half' },
|
|
322
|
+
{ id: id(), kind: 'activity', weeks: 26, span: 'half' },
|
|
323
|
+
{ id: id(), kind: 'stale', days: 14, limit: 5, span: 'half' },
|
|
324
|
+
];
|
|
325
|
+
default:
|
|
326
|
+
return defaultWidgets(defs);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/** True when a note is on one of this home's Pinned blocks. */
|
|
330
|
+
export function isPinned(schema, noteId) {
|
|
331
|
+
return homeWidgets(schema).some((w) => w.kind === 'pinned' && w.noteIds.includes(noteId));
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Pins a note to a workspace's home, or unpins it: what "Pin to dashboard" in
|
|
335
|
+
* a note's menu writes.
|
|
336
|
+
*
|
|
337
|
+
* Unpinning takes the note off every Pinned block it is on. Pinning puts it
|
|
338
|
+
* on the first block with room, and when the home has no Pinned block yet it
|
|
339
|
+
* adds one, as sticky notes, at the top: pinning from a note is a request to
|
|
340
|
+
* see it on the dashboard, and a pin into a block nobody can see is not that.
|
|
341
|
+
* An unarranged home is written out as its defaults plus the new block, so
|
|
342
|
+
* nothing already on it disappears.
|
|
343
|
+
*
|
|
344
|
+
* Null when every Pinned block is full, which the caller has to say.
|
|
345
|
+
*/
|
|
346
|
+
export function withPinToggled(schema, defs, noteId) {
|
|
347
|
+
const widgets = homeWidgets(schema, defs);
|
|
348
|
+
if (isPinned(schema, noteId)) {
|
|
349
|
+
return withHomeWidgets(schema, widgets.map((w) => w.kind === 'pinned' && w.noteIds.includes(noteId)
|
|
350
|
+
? { ...w, noteIds: w.noteIds.filter((id) => id !== noteId) }
|
|
351
|
+
: w));
|
|
352
|
+
}
|
|
353
|
+
const target = widgets.find((w) => w.kind === 'pinned' && w.noteIds.length < PINNED_MAX);
|
|
354
|
+
if (target) {
|
|
355
|
+
return withHomeWidgets(schema, widgets.map((w) => w === target && w.kind === 'pinned'
|
|
356
|
+
? { ...w, noteIds: [...w.noteIds, noteId] }
|
|
357
|
+
: w));
|
|
358
|
+
}
|
|
359
|
+
if (widgets.some((w) => w.kind === 'pinned'))
|
|
360
|
+
return null;
|
|
361
|
+
return withHomeWidgets(schema, [
|
|
362
|
+
{ id: newWidgetId(), kind: 'pinned', noteIds: [noteId], look: 'notes' },
|
|
363
|
+
...widgets,
|
|
364
|
+
]);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* The reserved property id meaning "place notes by when they last changed".
|
|
368
|
+
*
|
|
369
|
+
* Not a property: it is a fact every note already carries. A calendar could
|
|
370
|
+
* previously only be drawn by a workspace that had defined a date property,
|
|
371
|
+
* which made "calendar by default" false for exactly the workspaces that had
|
|
372
|
+
* never set anything up, which is most of them at the point somebody first
|
|
373
|
+
* opens a dashboard. A calendar of when you last touched things needs no
|
|
374
|
+
* setup and answers a real question.
|
|
375
|
+
*
|
|
376
|
+
* A calendar in this mode is read only: you cannot decide when a note was
|
|
377
|
+
* last edited.
|
|
378
|
+
*/
|
|
379
|
+
export const LAST_CHANGED = '@lastChanged';
|
|
380
|
+
/**
|
|
381
|
+
* The reserved property id meaning "place notes by when they were created".
|
|
382
|
+
*
|
|
383
|
+
* The other half of the same idea as LAST_CHANGED. They answer different
|
|
384
|
+
* questions and people want both: what have I touched lately, and what did I
|
|
385
|
+
* start when. Neither needs a workspace to have defined anything, and neither
|
|
386
|
+
* can be dragged, because you cannot decide when a note came into existence.
|
|
387
|
+
*/
|
|
388
|
+
export const CREATED = '@created';
|
|
389
|
+
/** True for the built-in date sources, which come from the note itself rather
|
|
390
|
+
* than from a property somebody defined. */
|
|
391
|
+
export function isNoteDate(propId) {
|
|
392
|
+
return propId === LAST_CHANGED || propId === CREATED;
|
|
393
|
+
}
|
|
394
|
+
/** The reserved property id that carries what used to be the plaintext tags column. */
|
|
395
|
+
export const TAGS_PROP = 'tags';
|
|
396
|
+
/** Matches the server's cap on the encrypted attrs blob (HTTP 413
|
|
397
|
+
* `ATTRS_TOO_LARGE`), measured as UTF-8 bytes of the ciphertext string. The
|
|
398
|
+
* single source of truth for both mcp-core (notes.ts) and the web app
|
|
399
|
+
* (src/lib/attrs/next.ts), so the two never drift apart. */
|
|
400
|
+
export const ATTRS_MAX_BYTES = 16384;
|
|
401
|
+
/** Matches the server's cap on the encrypted folder schema blob (HTTP 413
|
|
402
|
+
* `SCHEMA_TOO_LARGE`), measured as UTF-8 bytes of the ciphertext string. Lives
|
|
403
|
+
* beside ATTRS_MAX_BYTES for the same reason: mcp-core (notes.ts) and the web
|
|
404
|
+
* app (src/hooks/useFolderSchema.ts) both refuse an oversize blob before
|
|
405
|
+
* sending it, and two copies of the number would eventually disagree. */
|
|
406
|
+
export const SCHEMA_MAX_BYTES = 32768;
|
|
407
|
+
const DATE = new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' });
|
|
408
|
+
function day(value) {
|
|
409
|
+
// Date-only strings are parsed as UTC; formatting them in the local zone
|
|
410
|
+
// would show the day before for anyone west of Greenwich.
|
|
411
|
+
const iso = /^\d{4}-\d{2}-\d{2}$/.test(value) ? `${value}T12:00:00Z` : value;
|
|
412
|
+
const parsed = new Date(iso);
|
|
413
|
+
return Number.isNaN(parsed.getTime()) ? '' : DATE.format(parsed);
|
|
414
|
+
}
|
|
415
|
+
export function formatProp(def, value) {
|
|
416
|
+
if (!value)
|
|
417
|
+
return '';
|
|
418
|
+
switch (value.t) {
|
|
419
|
+
case 'text':
|
|
420
|
+
case 'url':
|
|
421
|
+
return value.v;
|
|
422
|
+
case 'number':
|
|
423
|
+
return String(value.v);
|
|
424
|
+
case 'checkbox':
|
|
425
|
+
return value.v ? 'Yes' : 'No';
|
|
426
|
+
case 'date':
|
|
427
|
+
return value.end ? `${day(value.v)} to ${day(value.end)}` : day(value.v);
|
|
428
|
+
case 'select':
|
|
429
|
+
return def.options?.find((o) => o.id === value.v)?.name ?? '';
|
|
430
|
+
case 'multiSelect':
|
|
431
|
+
return value.v.map((id) => def.options?.find((o) => o.id === id)?.name).filter(Boolean).join(', ');
|
|
432
|
+
case 'relation':
|
|
433
|
+
return value.v.length === 1 ? '1 note' : `${value.v.length} notes`;
|
|
434
|
+
default:
|
|
435
|
+
return '';
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
export function emptyAttrs(now = new Date().toISOString()) {
|
|
439
|
+
return { v: 1, props: {}, links: [], mentions: [], updated: now };
|
|
440
|
+
}
|
|
441
|
+
export function emptySchema() {
|
|
442
|
+
return { v: 1, properties: [], views: { default: 'list' } };
|
|
443
|
+
}
|
|
444
|
+
const PROP_TYPES = ['text', 'number', 'select', 'multiSelect', 'date', 'checkbox', 'url', 'relation'];
|
|
445
|
+
/** 12 hex characters, enough entropy that two properties never collide. */
|
|
446
|
+
export function newPropId() {
|
|
447
|
+
const bytes = crypto.getRandomValues(new Uint8Array(6));
|
|
448
|
+
return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
449
|
+
}
|
|
450
|
+
function isPropDefinition(value) {
|
|
451
|
+
if (!isRecord(value))
|
|
452
|
+
return false;
|
|
453
|
+
return (typeof value.id === 'string' &&
|
|
454
|
+
typeof value.name === 'string' &&
|
|
455
|
+
PROP_TYPES.includes(value.type) &&
|
|
456
|
+
typeof value.order === 'number');
|
|
457
|
+
}
|
|
458
|
+
/** Definitions in display order. Unknown shapes are dropped rather than
|
|
459
|
+
* thrown on: a newer client may write a type this one does not know. */
|
|
460
|
+
export function sortedProps(schema) {
|
|
461
|
+
const list = Array.isArray(schema?.properties) ? schema.properties : [];
|
|
462
|
+
return list
|
|
463
|
+
.filter(isPropDefinition)
|
|
464
|
+
.slice()
|
|
465
|
+
.sort((a, b) => a.order - b.order);
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Everything in `properties` that `sortedProps` drops: an entry whose type
|
|
469
|
+
* this build does not know, or whose shape it cannot read. A newer client
|
|
470
|
+
* writes those, and this one must hand them back untouched.
|
|
471
|
+
*
|
|
472
|
+
* Every mutator below rebuilds `properties`, and rebuilding it from
|
|
473
|
+
* `sortedProps` alone deleted these: renaming one property in the web app
|
|
474
|
+
* silently destroyed a property the desktop build had defined. The same vault
|
|
475
|
+
* is edited by three clients, and `setProperties` already keeps unknown attrs
|
|
476
|
+
* fields, so dropping them here made the codec disagree with itself.
|
|
477
|
+
*
|
|
478
|
+
* They are re-appended at the end and never renumbered. Their `order` belongs
|
|
479
|
+
* to a definition this build cannot read, and rewriting it would be guessing.
|
|
480
|
+
*/
|
|
481
|
+
function unreadableProps(schema) {
|
|
482
|
+
const list = Array.isArray(schema?.properties) ? schema.properties : [];
|
|
483
|
+
return list.filter((p) => !isPropDefinition(p));
|
|
484
|
+
}
|
|
485
|
+
/** The id an entry carries, whether or not this build can read the rest of
|
|
486
|
+
* it, so an explicit remove can still find it. */
|
|
487
|
+
function idOf(prop) {
|
|
488
|
+
const id = prop.id;
|
|
489
|
+
return typeof id === 'string' ? id : undefined;
|
|
490
|
+
}
|
|
491
|
+
/** Appends a new property definition, assigning it a fresh id (unless one is
|
|
492
|
+
* given) and an order past the current last property. Never mutates schema. */
|
|
493
|
+
export function defineProp(schema, def) {
|
|
494
|
+
const props = sortedProps(schema);
|
|
495
|
+
const last = props[props.length - 1];
|
|
496
|
+
const order = last === undefined ? 0 : last.order + 1;
|
|
497
|
+
const { id, ...rest } = def;
|
|
498
|
+
return { ...schema, properties: [...props, { ...rest, id: id ?? newPropId(), order }, ...unreadableProps(schema)] };
|
|
499
|
+
}
|
|
500
|
+
/** Patches a property definition by id, keeping its id fixed regardless of
|
|
501
|
+
* what the patch contains. Never mutates schema. */
|
|
502
|
+
export function updateProp(schema, id, patch) {
|
|
503
|
+
return {
|
|
504
|
+
...schema,
|
|
505
|
+
properties: [
|
|
506
|
+
...sortedProps(schema).map((p) => (p.id === id ? { ...p, ...patch, id: p.id } : p)),
|
|
507
|
+
// Never patched: a patch is written against a type this build knows,
|
|
508
|
+
// and applying it to a definition it cannot read would corrupt it.
|
|
509
|
+
...unreadableProps(schema),
|
|
510
|
+
],
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
/** Removes a property definition by id. Never mutates schema. */
|
|
514
|
+
export function removeProp(schema, id) {
|
|
515
|
+
return {
|
|
516
|
+
...schema,
|
|
517
|
+
properties: [
|
|
518
|
+
...sortedProps(schema).filter((p) => p.id !== id),
|
|
519
|
+
// Keeping the unreadable ones is about not deleting them by accident.
|
|
520
|
+
// A remove naming that id is not an accident, so it takes effect.
|
|
521
|
+
...unreadableProps(schema).filter((p) => idOf(p) !== id),
|
|
522
|
+
],
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
/** Reassigns order so the definitions match orderedIds; any definition whose
|
|
526
|
+
* id is not in the list keeps its relative position after the known ones.
|
|
527
|
+
* Never mutates schema. */
|
|
528
|
+
export function reorderProps(schema, orderedIds) {
|
|
529
|
+
const props = sortedProps(schema);
|
|
530
|
+
const rank = new Map(orderedIds.map((id, i) => [id, i]));
|
|
531
|
+
const next = props
|
|
532
|
+
.slice()
|
|
533
|
+
.sort((a, b) => (rank.get(a.id) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.id) ?? Number.MAX_SAFE_INTEGER))
|
|
534
|
+
.map((p, i) => ({ ...p, order: i }));
|
|
535
|
+
return { ...schema, properties: [...next, ...unreadableProps(schema)] };
|
|
536
|
+
}
|
|
537
|
+
function isRecord(value) {
|
|
538
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
539
|
+
}
|
|
540
|
+
function stringArray(value) {
|
|
541
|
+
return Array.isArray(value) ? value.filter((x) => typeof x === 'string') : [];
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* The type says v: 1, but a blob written by a future client may carry a
|
|
545
|
+
* higher version number. That numeric value is preserved on purpose, not
|
|
546
|
+
* downgraded, so a round trip through this reader does not lose it; only a
|
|
547
|
+
* missing or non-numeric v falls back to 1. The cast is needed because the
|
|
548
|
+
* field's declared type is the literal 1, not number.
|
|
549
|
+
*/
|
|
550
|
+
function decodedVersion(r) {
|
|
551
|
+
return (typeof r.v === 'number' && Number.isFinite(r.v) ? r.v : 1);
|
|
552
|
+
}
|
|
553
|
+
/** Normalize a decoded object into a NoteAttrsV1, keeping unknown fields. */
|
|
554
|
+
function asAttrs(raw) {
|
|
555
|
+
const r = isRecord(raw) ? raw : {};
|
|
556
|
+
return {
|
|
557
|
+
...r,
|
|
558
|
+
v: decodedVersion(r),
|
|
559
|
+
props: isRecord(r.props) ? r.props : {},
|
|
560
|
+
links: stringArray(r.links),
|
|
561
|
+
mentions: stringArray(r.mentions),
|
|
562
|
+
...(r.aliases !== undefined ? { aliases: stringArray(r.aliases) } : {}),
|
|
563
|
+
updated: typeof r.updated === 'string' ? r.updated : new Date(0).toISOString(),
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
function asSchema(raw) {
|
|
567
|
+
const r = isRecord(raw) ? raw : {};
|
|
568
|
+
const views = isRecord(r.views) ? r.views : {};
|
|
569
|
+
const def = views.default;
|
|
570
|
+
// 'home' was briefly one of these. It is not a way of listing notes, so it
|
|
571
|
+
// moved to the editor pane and out of this union; a workspace saved as
|
|
572
|
+
// 'home' by that build clamps to 'list' here rather than rendering nothing.
|
|
573
|
+
const allowed = ['list', 'table', 'board', 'calendar'];
|
|
574
|
+
return {
|
|
575
|
+
...r,
|
|
576
|
+
v: decodedVersion(r),
|
|
577
|
+
properties: Array.isArray(r.properties) ? r.properties : [],
|
|
578
|
+
views: { ...views, default: allowed.includes(def) ? def : 'list' },
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
export async function encodeAttrs(key, attrs) {
|
|
582
|
+
return encryptStringBlob(key, JSON.stringify(attrs));
|
|
583
|
+
}
|
|
584
|
+
export async function decodeAttrs(key, blob) {
|
|
585
|
+
if (!blob)
|
|
586
|
+
return null;
|
|
587
|
+
return asAttrs(JSON.parse(await decryptStringBlob(key, blob)));
|
|
588
|
+
}
|
|
589
|
+
export async function encodeSchema(key, schema) {
|
|
590
|
+
return encryptStringBlob(key, JSON.stringify(schema));
|
|
591
|
+
}
|
|
592
|
+
export async function decodeSchema(key, blob) {
|
|
593
|
+
if (!blob)
|
|
594
|
+
return null;
|
|
595
|
+
return asSchema(JSON.parse(await decryptStringBlob(key, blob)));
|
|
596
|
+
}
|
|
597
|
+
export function tagsFromAttrs(attrs) {
|
|
598
|
+
const value = attrs?.props[TAGS_PROP];
|
|
599
|
+
return value && value.t === 'multiSelect' ? [...value.v] : [];
|
|
600
|
+
}
|
|
601
|
+
export function withTags(attrs, tags, now = new Date().toISOString()) {
|
|
602
|
+
return { ...attrs, props: { ...attrs.props, [TAGS_PROP]: { t: 'multiSelect', v: [...tags] } }, updated: now };
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=attrs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attrs.js","sourceRoot":"","sources":["../src/attrs.ts"],"names":[],"mappings":"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"}
|