@bassfish/cli 0.1.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.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -0
  3. package/dist/api.d.ts +365 -0
  4. package/dist/api.js +113 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +217 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config.d.ts +20 -0
  10. package/dist/config.js +68 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/daemon.d.ts +4 -0
  13. package/dist/daemon.js +220 -0
  14. package/dist/daemon.js.map +1 -0
  15. package/dist/domain.d.ts +393 -0
  16. package/dist/domain.js +75 -0
  17. package/dist/domain.js.map +1 -0
  18. package/dist/export.d.ts +7 -0
  19. package/dist/export.js +37 -0
  20. package/dist/export.js.map +1 -0
  21. package/dist/ipc.d.ts +14 -0
  22. package/dist/ipc.js +125 -0
  23. package/dist/ipc.js.map +1 -0
  24. package/dist/lock.d.ts +2 -0
  25. package/dist/lock.js +18 -0
  26. package/dist/lock.js.map +1 -0
  27. package/dist/mcp.d.ts +16 -0
  28. package/dist/mcp.js +200 -0
  29. package/dist/mcp.js.map +1 -0
  30. package/dist/note-cli.d.ts +28 -0
  31. package/dist/note-cli.js +204 -0
  32. package/dist/note-cli.js.map +1 -0
  33. package/dist/note.d.ts +12 -0
  34. package/dist/note.js +181 -0
  35. package/dist/note.js.map +1 -0
  36. package/dist/repository.d.ts +1 -0
  37. package/dist/repository.js +21 -0
  38. package/dist/repository.js.map +1 -0
  39. package/dist/runtime.d.ts +12 -0
  40. package/dist/runtime.js +32 -0
  41. package/dist/runtime.js.map +1 -0
  42. package/dist/service.d.ts +106 -0
  43. package/dist/service.js +1185 -0
  44. package/dist/service.js.map +1 -0
  45. package/dist/setup.d.ts +21 -0
  46. package/dist/setup.js +108 -0
  47. package/dist/setup.js.map +1 -0
  48. package/dist/sql-worker.d.ts +6 -0
  49. package/dist/sql-worker.js +76 -0
  50. package/dist/sql-worker.js.map +1 -0
  51. package/dist/storage/control.d.ts +10 -0
  52. package/dist/storage/control.js +160 -0
  53. package/dist/storage/control.js.map +1 -0
  54. package/dist/storage/dolt.d.ts +32 -0
  55. package/dist/storage/dolt.js +494 -0
  56. package/dist/storage/dolt.js.map +1 -0
  57. package/dist/storage/search.d.ts +22 -0
  58. package/dist/storage/search.js +75 -0
  59. package/dist/storage/search.js.map +1 -0
  60. package/dist/supervisor.d.ts +11 -0
  61. package/dist/supervisor.js +97 -0
  62. package/dist/supervisor.js.map +1 -0
  63. package/dist/tasks.d.ts +52 -0
  64. package/dist/tasks.js +33 -0
  65. package/dist/tasks.js.map +1 -0
  66. package/dist/thread-cli.d.ts +2 -0
  67. package/dist/thread-cli.js +64 -0
  68. package/dist/thread-cli.js.map +1 -0
  69. package/package.json +64 -0
package/dist/note.js ADDED
@@ -0,0 +1,181 @@
1
+ import { increment, requireThat } from './domain.js';
2
+ export const normalizeLabels = (labels) => {
3
+ const sorted = [...labels].sort();
4
+ requireThat(new Set(sorted).size === sorted.length, 'INVALID_ARGUMENT', 'Note labels must be unique.');
5
+ return sorted;
6
+ };
7
+ export const normalizeLinks = (links) => {
8
+ const sorted = [...links].sort((a, b) => `${a.targetType}:${a.targetId}`.localeCompare(`${b.targetType}:${b.targetId}`));
9
+ requireThat(new Set(sorted.map(link => `${link.targetType}:${link.targetId}`)).size === sorted.length, 'INVALID_ARGUMENT', 'Resource links must be unique.');
10
+ return sorted;
11
+ };
12
+ function applyUnifiedPatch(body, patch) {
13
+ const rows = patch.replaceAll('\r\n', '\n').split('\n');
14
+ requireThat(rows.filter(row => row.startsWith('--- ')).length <= 1 && rows.filter(row => row.startsWith('+++ ')).length <= 1, 'PATCH_REJECTED', 'A patch may contain only one file section.');
15
+ requireThat(!rows.some(row => /^(rename (from|to)|new file mode|deleted file mode)/.test(row)), 'PATCH_REJECTED', 'File creation, deletion, and rename patches are not supported.');
16
+ const source = body.split('\n');
17
+ const output = [];
18
+ let sourceIndex = 0;
19
+ let index = 0;
20
+ while (index < rows.length && !rows[index].startsWith('@@ '))
21
+ index++;
22
+ requireThat(index < rows.length, 'PATCH_REJECTED', 'The unified patch contains no hunks.');
23
+ while (index < rows.length) {
24
+ const header = rows[index++];
25
+ const match = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/.exec(header);
26
+ requireThat(match, 'PATCH_REJECTED', 'A patch hunk header is invalid.');
27
+ const oldStart = Number(match[1]) - 1;
28
+ requireThat(oldStart >= sourceIndex && oldStart <= source.length, 'PATCH_REJECTED', 'A patch hunk is out of order or out of range.');
29
+ output.push(...source.slice(sourceIndex, oldStart));
30
+ sourceIndex = oldStart;
31
+ let removed = 0;
32
+ let added = 0;
33
+ while (index < rows.length && !rows[index].startsWith('@@ ')) {
34
+ const row = rows[index++];
35
+ if (row === '\' || (index === rows.length && row === ''))
36
+ continue;
37
+ const marker = row[0];
38
+ const text = row.slice(1);
39
+ requireThat(marker === ' ' || marker === '+' || marker === '-', 'PATCH_REJECTED', 'A patch hunk line is invalid.');
40
+ if (marker === ' ' || marker === '-') {
41
+ requireThat(source[sourceIndex] === text, 'PATCH_REJECTED', 'Patch context does not exactly match the claimed revision.');
42
+ if (marker === ' ')
43
+ output.push(text);
44
+ sourceIndex++;
45
+ removed++;
46
+ }
47
+ if (marker === '+') {
48
+ output.push(text);
49
+ added++;
50
+ }
51
+ }
52
+ requireThat(removed === Number(match[2] ?? 1) && added === Number(match[4] ?? 1), 'PATCH_REJECTED', 'Patch hunk counts do not match its header.');
53
+ }
54
+ output.push(...source.slice(sourceIndex));
55
+ return output.join('\n');
56
+ }
57
+ function applyOne(note, mutation) {
58
+ const next = structuredClone(note);
59
+ const contentEdit = ['replaceNoteBody', 'patchNoteBody', 'appendNoteBody', 'prependNoteBody', 'replaceNoteText', 'upsertNoteSection', 'moveNote', 'setNoteMetadata', 'setLinks'].includes(mutation.kind);
60
+ requireThat(!contentEdit || note.state === 'active', 'RESOURCE_ARCHIVED', 'Restore the note before editing it.');
61
+ switch (mutation.kind) {
62
+ case 'replaceNoteBody':
63
+ next.body = mutation.body;
64
+ break;
65
+ case 'patchNoteBody':
66
+ next.body = applyUnifiedPatch(note.body, mutation.patch);
67
+ break;
68
+ case 'appendNoteBody':
69
+ next.body += mutation.body;
70
+ break;
71
+ case 'prependNoteBody':
72
+ next.body = mutation.body + next.body;
73
+ break;
74
+ case 'moveNote':
75
+ next.path = mutation.path;
76
+ break;
77
+ case 'setNoteMetadata':
78
+ requireThat(mutation.title !== undefined || mutation.labels !== undefined || mutation.noteKind !== undefined, 'INVALID_ARGUMENT', 'Set at least one metadata field.');
79
+ if (mutation.title !== undefined)
80
+ next.title = mutation.title;
81
+ if (mutation.labels !== undefined)
82
+ next.labels = normalizeLabels(mutation.labels);
83
+ if (mutation.noteKind !== undefined)
84
+ next.kind = mutation.noteKind;
85
+ break;
86
+ case 'setLinks':
87
+ next.links = normalizeLinks(mutation.links);
88
+ break;
89
+ case 'archiveNote':
90
+ requireThat(note.state === 'active', 'NO_CHANGE', 'Only an active note can be archived.');
91
+ next.state = 'archived';
92
+ break;
93
+ case 'deleteNote':
94
+ requireThat(note.state !== 'deleted', 'NO_CHANGE', 'The note is already deleted.');
95
+ next.state = 'deleted';
96
+ break;
97
+ case 'activateNote':
98
+ requireThat(note.state !== 'active', 'NO_CHANGE', 'The note is already active.');
99
+ next.state = 'active';
100
+ break;
101
+ case 'replaceNoteText': {
102
+ const count = note.body.split(mutation.find).length - 1;
103
+ requireThat(count === mutation.expectedOccurrences, 'OCCURRENCE_MISMATCH', 'The expected occurrence count does not match the claimed body.');
104
+ next.body = note.body.split(mutation.find).join(mutation.replace);
105
+ break;
106
+ }
107
+ case 'upsertNoteSection': {
108
+ const headings = outline(note.body);
109
+ const matches = headings.filter(item => item.path.join('\u0000') === mutation.headingPath.join('\u0000'));
110
+ if (!matches.length) {
111
+ requireThat(mutation.createIfMissing, 'SECTION_NOT_FOUND', 'The requested Markdown section does not exist.');
112
+ const suffix = `${note.body && !note.body.endsWith('\n') ? '\n' : ''}\n${mutation.headingPath.map((heading, index) => `${'#'.repeat(index + 1)} ${heading}`).join('\n\n')}\n\n${mutation.body}`;
113
+ next.body += suffix;
114
+ }
115
+ else {
116
+ requireThat(matches.length === 1 || mutation.occurrence !== undefined, 'SECTION_AMBIGUOUS', 'The heading path is ambiguous; provide an occurrence.');
117
+ const match = matches[(mutation.occurrence ?? 1) - 1];
118
+ requireThat(match, 'SECTION_NOT_FOUND', 'The heading occurrence does not exist.');
119
+ const lines = note.body.split('\n');
120
+ const heading = lines[match.startLine - 1];
121
+ lines.splice(match.startLine - 1, match.endLine - match.startLine + 1, heading, mutation.body);
122
+ next.body = lines.join('\n');
123
+ }
124
+ break;
125
+ }
126
+ }
127
+ requireThat(Buffer.byteLength(next.body, 'utf8') <= 256 * 1024, 'CONTENT_TOO_LARGE', 'The resulting note exceeds 256 KiB.');
128
+ return next;
129
+ }
130
+ export function outline(body) {
131
+ const lines = body.split('\n');
132
+ const items = [];
133
+ const stack = [];
134
+ let fence;
135
+ for (let index = 0; index < lines.length; index++) {
136
+ const line = lines[index];
137
+ const marker = /^ {0,3}(```+|~~~+)/.exec(line)?.[1];
138
+ if (marker) {
139
+ if (!fence)
140
+ fence = marker[0];
141
+ else if (marker[0] === fence)
142
+ fence = undefined;
143
+ continue;
144
+ }
145
+ if (fence)
146
+ continue;
147
+ const atx = /^ {0,3}(#{1,6})\s+(.+?)\s*#*\s*$/.exec(line);
148
+ const setext = index + 1 < lines.length ? /^ {0,3}(=+|-+)\s*$/.exec(lines[index + 1]) : null;
149
+ const level = atx ? atx[1].length : setext && line.trim() ? (setext[1][0] === '=' ? 1 : 2) : 0;
150
+ if (!level)
151
+ continue;
152
+ const heading = (atx ? atx[2] : line.trim());
153
+ stack.length = level - 1;
154
+ stack[level - 1] = heading;
155
+ items.push({ level, heading, path: [...stack], startLine: index + 1, endLine: lines.length });
156
+ if (!atx)
157
+ index++;
158
+ }
159
+ for (let index = 0; index < items.length; index++) {
160
+ const next = items.slice(index + 1).find(item => item.level <= items[index].level);
161
+ if (next)
162
+ items[index].endLine = next.startLine - 1;
163
+ }
164
+ return items;
165
+ }
166
+ export function prepareNote(note, mutation, actor, at) {
167
+ let next = structuredClone(note);
168
+ if (mutation.kind === 'batchNote')
169
+ for (const item of mutation.mutations)
170
+ next = applyOne(next, item);
171
+ else
172
+ next = applyOne(next, mutation);
173
+ const comparable = (value) => JSON.stringify({ ...value, revision: 'x', lastEditor: 'x', lastEditorName: 'x', updatedAt: 'x' });
174
+ requireThat(comparable(next) !== comparable(note), 'NO_CHANGE', 'The note mutation makes no change.');
175
+ next.revision = increment(note.revision);
176
+ next.lastEditor = actor.identityId;
177
+ next.lastEditorName = actor.name;
178
+ next.updatedAt = at;
179
+ return next;
180
+ }
181
+ //# sourceMappingURL=note.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note.js","sourceRoot":"","sources":["../src/note.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function resolveRepository(workspace: string): Promise<string>;
@@ -0,0 +1,21 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { realpath } from 'node:fs/promises';
4
+ import { BassfishError } from './domain.js';
5
+ const exec = promisify(execFile);
6
+ export async function resolveRepository(workspace) {
7
+ try {
8
+ const root = await realpath(workspace);
9
+ const env = { ...process.env };
10
+ // An enclosing shell's Git overrides must not redirect a workspace's project identity.
11
+ for (const key of Object.keys(env))
12
+ if (key.startsWith('GIT_'))
13
+ delete env[key];
14
+ const { stdout } = await exec('git', ['-C', root, 'rev-parse', '--path-format=absolute', '--git-common-dir'], { env, timeout: 5000 });
15
+ return await realpath(stdout.trim());
16
+ }
17
+ catch {
18
+ throw new BassfishError('NOT_A_REPOSITORY', 'The configured workspace must be a local Git repository.');
19
+ }
20
+ }
21
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AACjC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB;IACvD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/B,uFAAuF;QACvF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QAChF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,wBAAwB,EAAE,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACtI,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,0DAA0D,CAAC,CAAC;IAAC,CAAC;AACtH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Clock } from './domain.js';
2
+ export declare class SystemClock implements Clock {
3
+ private readonly origin;
4
+ private offset;
5
+ now(): number;
6
+ wallNow(): number;
7
+ discontinuity(): boolean;
8
+ }
9
+ export declare class KeyedMutex {
10
+ private readonly tails;
11
+ run<T>(key: string, fn: () => Promise<T>): Promise<T>;
12
+ }
@@ -0,0 +1,32 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ export class SystemClock {
3
+ origin = Date.now() - performance.now();
4
+ offset = Date.now() - performance.now();
5
+ now() { return this.origin + performance.now(); }
6
+ wallNow() { return Date.now(); }
7
+ discontinuity() {
8
+ const offset = Date.now() - performance.now();
9
+ const changed = Math.abs(offset - this.offset) > 2_000;
10
+ this.offset = offset;
11
+ return changed;
12
+ }
13
+ }
14
+ export class KeyedMutex {
15
+ tails = new Map();
16
+ async run(key, fn) {
17
+ const previous = this.tails.get(key) ?? Promise.resolve();
18
+ let release;
19
+ const next = new Promise(resolve => { release = resolve; });
20
+ this.tails.set(key, next);
21
+ await previous;
22
+ try {
23
+ return await fn();
24
+ }
25
+ finally {
26
+ release();
27
+ if (this.tails.get(key) === next)
28
+ this.tails.delete(key);
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,MAAM,OAAO,WAAW;IACL,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACjD,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChD,GAAG,KAAa,OAAO,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzD,OAAO,KAAa,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACxC,aAAa;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,MAAM,OAAO,UAAU;IACJ,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC1D,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,EAAoB;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1D,IAAI,OAAoB,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,QAAQ,CAAC;QACf,IAAI,CAAC;YAAC,OAAO,MAAM,EAAE,EAAE,CAAC;QAAC,CAAC;gBAClB,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;IAClF,CAAC;CACF"}
@@ -0,0 +1,106 @@
1
+ import type { Clock, ContentStore, ControlStore, FloorRequest, Mutation, MutationResult, ProjectRestoreResult, ResourceType } from './domain.js';
2
+ import { NoteSearchIndex } from './storage/search.js';
3
+ export interface Limits {
4
+ offerMs: number;
5
+ leaseMs: number;
6
+ reconnectMs: number;
7
+ instanceMs: number;
8
+ queueMs: number;
9
+ retentionMs: number;
10
+ waitMs: number;
11
+ }
12
+ export declare const defaultLimits: Limits;
13
+ /** Application service: all coordination is persisted by ControlStore; all content uses ContentStore. */
14
+ export declare class Bassfish {
15
+ readonly control: ControlStore;
16
+ readonly content: ContentStore;
17
+ readonly clock: Clock;
18
+ private readonly searchIndex?;
19
+ private readonly dataDir?;
20
+ readonly epoch: `${string}-${string}-${string}-${string}-${string}`;
21
+ readonly limits: Limits;
22
+ private readonly writers;
23
+ private readonly restoreSecret;
24
+ constructor(control: ControlStore, content: ContentStore, clock: Clock, limits?: Partial<Limits>, searchIndex?: NoteSearchIndex | undefined, dataDir?: string | undefined);
25
+ initialize(): Promise<void>;
26
+ open(commonDir: string, preferredName?: string): Promise<{
27
+ agentHandle: string;
28
+ session: unknown;
29
+ }>;
30
+ private actor;
31
+ private ready;
32
+ private creationAllowed;
33
+ private finish;
34
+ private disconnectIn;
35
+ disconnect(handle: string, clean?: boolean): void;
36
+ heartbeat(handle: string): void;
37
+ sweep(): void;
38
+ private promote;
39
+ private makeAvailable;
40
+ private materializeOffer;
41
+ private rebind;
42
+ info(handle: string): unknown;
43
+ requestName(handle: string, name: string): unknown;
44
+ private statusIn;
45
+ private ownRequest;
46
+ private ownTask;
47
+ private taskView;
48
+ getTask(handle: string, taskId: string, materialize?: boolean): Record<string, unknown>;
49
+ cancelTask(handle: string, taskId: string): Record<string, unknown>;
50
+ waitTask(handle: string, taskId: string, updatedAfter: number, timeout: number, signal?: AbortSignal): Promise<Record<string, unknown>>;
51
+ status(handle: string, ticketId: string): Record<string, unknown>;
52
+ private held;
53
+ requestResourceFloor(handle: string, resourceTypeOrId: ResourceType | string, maybeResourceId?: string, deliveryMode?: 'ticket' | 'task'): Promise<Record<string, unknown>>;
54
+ requestProjectFloor(handle: string, purpose: FloorRequest['purpose'], deliveryMode?: 'ticket' | 'task'): Promise<Record<string, unknown>>;
55
+ claimFloor(handle: string, offerId: string, limit: number, noteCursor?: string): Promise<unknown>;
56
+ read(handle: string, floorId: string, fence: string, limit: number, before?: string): Promise<unknown>;
57
+ readNote(handle: string, floorId: string, fence: string, cursor?: string): Promise<unknown>;
58
+ readFloor(handle: string, floorId: string, fence: string, cursor?: string): Promise<unknown>;
59
+ noteOutline(handle: string, floorId: string, fence: string): Promise<unknown>;
60
+ findNote(handle: string, floorId: string, fence: string, query: string, mode: 'literal' | 'regex', limit: number): Promise<unknown>;
61
+ releaseFloor(handle: string, floorId: string, fence: string): unknown;
62
+ cancelFloorRequest(handle: string, ticketId: string): unknown;
63
+ waitForFloor(handle: string, ticketId: string, timeout: number, signal?: AbortSignal): Promise<unknown>;
64
+ createThread(handle: string, title: string, description: string): Promise<unknown>;
65
+ private noteMetadata;
66
+ private validateLinks;
67
+ createNote(handle: string, input: {
68
+ path: string;
69
+ title: string;
70
+ body: string;
71
+ labels: string[];
72
+ noteKind: string | null;
73
+ links: {
74
+ targetType: 'note' | 'thread' | 'message';
75
+ targetId: string;
76
+ }[];
77
+ }): Promise<unknown>;
78
+ private signRestore;
79
+ private verifyRestore;
80
+ resourceHistory(handle: string, floorId: string, fence: string, offset: number, limit: number): Promise<unknown>;
81
+ resourceAt(handle: string, floorId: string, fence: string, revision: string, limit: number, cursor?: string): Promise<unknown>;
82
+ diffResource(handle: string, floorId: string, fence: string, revision: string): Promise<unknown>;
83
+ previewRestore(handle: string, floorId: string, fence: string, revision: string): Promise<unknown>;
84
+ restoreRevision(handle: string, floorId: string, fence: string, token: string): Promise<MutationResult>;
85
+ private projectHeld;
86
+ projectSnapshotInfo(handle: string, floorId: string, fence: string): Promise<unknown>;
87
+ private cursorOffset;
88
+ private nextCursor;
89
+ projectSearch(handle: string, floorId: string, fence: string, query: string, states: string[], limit: number, cursor?: string): Promise<unknown>;
90
+ projectHistorySearch(handle: string, floorId: string, fence: string, query: string, noteId: string | undefined, states: string[], limit: number, cursor?: string): Promise<unknown>;
91
+ projectHistoryList(handle: string, floorId: string, fence: string, limit: number, cursor?: string): Promise<unknown>;
92
+ private buildProjectRestore;
93
+ previewProjectRestore(handle: string, floorId: string, fence: string, targetCommit: string, limit: number, cursor?: string): Promise<unknown>;
94
+ restoreProject(handle: string, floorId: string, fence: string, token: string): Promise<ProjectRestoreResult>;
95
+ exportProject(handle: string, floorId: string, fence: string): Promise<unknown>;
96
+ commitFloor(handle: string, floorId: string, fence: string, base: string, mutation: Mutation): Promise<MutationResult>;
97
+ private finalize;
98
+ private persist;
99
+ recover(projectId: string): Promise<void>;
100
+ inspect(): unknown;
101
+ hasPendingWork(): boolean;
102
+ forceRelease(floorId: string): void;
103
+ call(handle: string, name: string, input: unknown, signal?: AbortSignal, options?: {
104
+ taskCapable?: boolean;
105
+ }): Promise<unknown>;
106
+ }