@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.js","sourceRoot":"","sources":["../src/ipc.ts"],"names":[],"mappings":"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"}
package/dist/lock.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ /** SQLite's rollback-journal EXCLUSIVE transaction holds a kernel file lock until close/process death. */
2
+ export declare function exclusiveLock(path: string, waitMs?: number): () => void;
package/dist/lock.js ADDED
@@ -0,0 +1,18 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { mkdirSync } from 'node:fs';
3
+ import { dirname } from 'node:path';
4
+ import { BassfishError } from './domain.js';
5
+ /** SQLite's rollback-journal EXCLUSIVE transaction holds a kernel file lock until close/process death. */
6
+ export function exclusiveLock(path, waitMs = 0) {
7
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
8
+ const db = new DatabaseSync(path);
9
+ try {
10
+ db.exec(`PRAGMA busy_timeout=${Math.trunc(waitMs)}; BEGIN EXCLUSIVE;`);
11
+ }
12
+ catch {
13
+ db.close();
14
+ throw new BassfishError('ALREADY_RUNNING', 'Another process holds the service ownership lock.');
15
+ }
16
+ return () => { db.exec('ROLLBACK'); db.close(); };
17
+ }
18
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,0GAA0G;AAC1G,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAM,GAAG,CAAC;IACpD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,mDAAmD,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import type { JSONRPCMessage, Transport } from '@modelcontextprotocol/server';
2
+ export declare class TaskAwareStdioTransport implements Transport {
3
+ private readonly subscribe;
4
+ private readonly inner;
5
+ onclose?: () => void;
6
+ onerror?: (error: Error) => void;
7
+ onmessage?: (message: JSONRPCMessage) => void;
8
+ private taskIds;
9
+ private subscriptionMeta;
10
+ constructor(subscribe: (ids: string[]) => void, inner?: Transport);
11
+ start(): Promise<void>;
12
+ close(): Promise<void>;
13
+ send(message: JSONRPCMessage): Promise<void>;
14
+ }
15
+ /** Stdio adapter: MCP validation and transport around the shared Bassfish daemon. */
16
+ export declare function runMcp(workspace: string, dataDir: string, binary: string, name?: string): Promise<void>;
package/dist/mcp.js ADDED
@@ -0,0 +1,200 @@
1
+ import { McpServer } from '@modelcontextprotocol/server';
2
+ import { serveStdio, StdioServerTransport } from '@modelcontextprotocol/server/stdio';
3
+ import { BassfishError } from './domain.js';
4
+ import { schemas, descriptions } from './api.js';
5
+ import { connectDaemon, ensureDaemon } from './daemon.js';
6
+ import { cancelTaskParams, getTaskParams, hasTasksCapability, taskAck, taskResult, tasksExtensionId, toolResult, updateTaskParams, wireTask, wireTaskNotification } from './tasks.js';
7
+ import { packageVersion } from './config.js';
8
+ export class TaskAwareStdioTransport {
9
+ subscribe;
10
+ inner;
11
+ onclose;
12
+ onerror;
13
+ onmessage;
14
+ taskIds = new Set();
15
+ subscriptionMeta;
16
+ constructor(subscribe, inner = new StdioServerTransport()) {
17
+ this.subscribe = subscribe;
18
+ this.inner = inner;
19
+ }
20
+ async start() {
21
+ this.inner.onclose = () => this.onclose?.();
22
+ this.inner.onerror = error => this.onerror?.(error);
23
+ this.inner.onmessage = message => {
24
+ const raw = message;
25
+ if (raw.method === 'subscriptions/listen') {
26
+ const clone = structuredClone(raw);
27
+ const params = clone.params;
28
+ const notifications = params?.notifications;
29
+ const ids = Array.isArray(notifications?.taskIds) ? notifications.taskIds.filter(value => typeof value === 'string') : [];
30
+ if (ids.length) {
31
+ const meta = params?._meta;
32
+ const envelope = meta?.['io.modelcontextprotocol/clientCapabilities'] ? { clientCapabilities: meta['io.modelcontextprotocol/clientCapabilities'] } : undefined;
33
+ if (!hasTasksCapability(envelope)) {
34
+ void this.inner.send({ jsonrpc: '2.0', id: raw.id, error: { code: -32021, message: 'Missing required client capability', data: { requiredCapabilities: { extensions: { [tasksExtensionId]: {} } } } } });
35
+ return;
36
+ }
37
+ this.taskIds = new Set(ids);
38
+ delete notifications.taskIds;
39
+ this.subscribe(ids);
40
+ }
41
+ this.onmessage?.(clone);
42
+ return;
43
+ }
44
+ this.onmessage?.(message);
45
+ };
46
+ await this.inner.start();
47
+ }
48
+ async close() { await this.inner.close(); }
49
+ async send(message) {
50
+ const raw = structuredClone(message);
51
+ if (raw.method === 'notifications/subscriptions/acknowledged' && this.taskIds.size) {
52
+ const params = raw.params;
53
+ const notifications = (params.notifications ??= {});
54
+ notifications.taskIds = [...this.taskIds];
55
+ this.subscriptionMeta = params._meta;
56
+ }
57
+ if (raw.method === 'notifications/tasks' && this.subscriptionMeta) {
58
+ const params = raw.params;
59
+ params._meta = { ...params._meta, ...this.subscriptionMeta };
60
+ }
61
+ const result = raw.result;
62
+ const structured = result?.structuredContent;
63
+ if (structured?.__bassfishTask)
64
+ raw.result = { ...wireTask(structured.__bassfishTask, 'task'), ...(result?._meta ? { _meta: result._meta } : {}) };
65
+ await this.inner.send(raw);
66
+ }
67
+ }
68
+ /** Stdio adapter: MCP validation and transport around the shared Bassfish daemon. */
69
+ export async function runMcp(workspace, dataDir, binary, name) {
70
+ let client;
71
+ let connecting;
72
+ let heartbeat;
73
+ let stopped = false;
74
+ let preferredName = name;
75
+ async function connection() {
76
+ if (client && !client.socket.destroyed)
77
+ return client;
78
+ return connecting ??= (async () => {
79
+ await ensureDaemon(dataDir, binary);
80
+ const opened = await connectDaemon(dataDir);
81
+ try {
82
+ const result = await opened.call('openSession', { workspace, name: preferredName });
83
+ if (stopped) {
84
+ await opened.call('closeSession');
85
+ throw new BassfishError('CANCELLED', 'Adapter stopped during startup.');
86
+ }
87
+ preferredName = result.session.name;
88
+ client = opened;
89
+ if (heartbeat)
90
+ clearInterval(heartbeat);
91
+ heartbeat = setInterval(() => {
92
+ void opened.call('heartbeatSession').catch(() => { if (heartbeat)
93
+ clearInterval(heartbeat); opened.socket.destroy(); });
94
+ }, 5000);
95
+ heartbeat.unref();
96
+ return opened;
97
+ }
98
+ catch (error) {
99
+ opened.close();
100
+ throw error;
101
+ }
102
+ })().finally(() => { connecting = undefined; });
103
+ }
104
+ let protocolServer;
105
+ const watchers = new Map();
106
+ const watchTasks = (ids) => {
107
+ for (const taskId of ids)
108
+ if (!watchers.has(taskId)) {
109
+ const controller = new AbortController();
110
+ watchers.set(taskId, controller);
111
+ void (async () => {
112
+ let after = 0;
113
+ while (!controller.signal.aborted) {
114
+ try {
115
+ const backend = await connection();
116
+ const task = await backend.call('waitTask', { taskId, updatedAfter: after, timeoutMs: 20_000 }, controller.signal);
117
+ const updated = Date.parse(String(task.lastUpdatedAt));
118
+ if (updated > after) {
119
+ after = updated;
120
+ await protocolServer?.server.notification({ method: 'notifications/tasks', params: wireTaskNotification(task) });
121
+ }
122
+ if (['completed', 'failed', 'cancelled'].includes(String(task.status)))
123
+ break;
124
+ }
125
+ catch (error) {
126
+ if (!controller.signal.aborted && error instanceof BassfishError && error.code !== 'TASK_NOT_FOUND')
127
+ continue;
128
+ break;
129
+ }
130
+ }
131
+ watchers.delete(taskId);
132
+ })();
133
+ }
134
+ };
135
+ const taskTransport = new TaskAwareStdioTransport(watchTasks);
136
+ const transport = await serveStdio(() => {
137
+ const server = new McpServer({ name: 'bassfish', version: packageVersion }, { capabilities: { tools: {}, extensions: { [tasksExtensionId]: {} } } });
138
+ protocolServer = server;
139
+ server.server.setRequestHandler('tasks/get', { params: getTaskParams, result: taskResult }, async (params) => {
140
+ const backend = await connection();
141
+ return wireTask(await backend.call('getTask', { taskId: params.taskId }), 'complete');
142
+ });
143
+ server.server.setRequestHandler('tasks/cancel', { params: cancelTaskParams, result: taskAck }, async (params) => {
144
+ const backend = await connection();
145
+ await backend.call('cancelTask', { taskId: params.taskId });
146
+ return { resultType: 'complete' };
147
+ });
148
+ server.server.setRequestHandler('tasks/update', { params: updateTaskParams, result: taskAck }, async (params) => {
149
+ const backend = await connection();
150
+ await backend.call('peekTask', { taskId: params.taskId });
151
+ throw new BassfishError('INVALID_TASK_STATE', 'Bassfish floor tasks never request client input.');
152
+ });
153
+ for (const name of Object.keys(schemas)) {
154
+ const inputSchema = schemas[name];
155
+ server.registerTool(name, { description: descriptions[name], inputSchema,
156
+ annotations: { readOnlyHint: ['getSession', 'listAgents', 'listThreads', 'getThread', 'searchThreads', 'listNotes', 'searchNotes', 'getFloorRequest', 'waitForFloor', 'readFloor', 'listHistory', 'readRevision', 'diffRevision', 'previewRestore', 'getNoteOutline', 'findInNote', 'inspectSnapshot', 'searchProjectNotes', 'searchProjectNoteHistory', 'listSnapshotHistory', 'previewSnapshotRestore'].includes(name),
157
+ destructiveHint: ['commitFloor', 'restoreRevision', 'restoreSnapshot'].includes(name), idempotentHint: false, openWorldHint: false } }, async (args, context) => {
158
+ try {
159
+ const backend = await connection();
160
+ const taskCapable = name === 'requestFloor' && hasTasksCapability(context.mcpReq.envelope);
161
+ const data = await backend.call('callTool', { name, args, taskCapable }, context.mcpReq.signal);
162
+ if (name === 'setAgentName')
163
+ preferredName = data.name;
164
+ if (data && typeof data === 'object' && 'task' in data)
165
+ return { content: [], structuredContent: { __bassfishTask: data.task } };
166
+ return toolResult(data);
167
+ }
168
+ catch (error) {
169
+ const failure = error instanceof BassfishError ? error : new BassfishError('BACKEND_UNAVAILABLE', 'Bassfish could not complete the request. No operation was retried.');
170
+ const output = { error: { code: failure.code, message: failure.message } };
171
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(output) }], structuredContent: output };
172
+ }
173
+ });
174
+ }
175
+ return server;
176
+ }, { transport: taskTransport });
177
+ const stop = async () => {
178
+ if (stopped)
179
+ return;
180
+ stopped = true;
181
+ if (heartbeat)
182
+ clearInterval(heartbeat);
183
+ for (const watcher of watchers.values())
184
+ watcher.abort();
185
+ watchers.clear();
186
+ try {
187
+ if (client && !client.socket.destroyed)
188
+ await client.call('closeSession');
189
+ }
190
+ finally {
191
+ client?.close();
192
+ await transport.close();
193
+ }
194
+ };
195
+ const shutdown = () => { void stop().catch(() => { client?.socket.destroy(); }); };
196
+ process.stdin.once('end', shutdown);
197
+ process.once('SIGTERM', shutdown);
198
+ process.once('SIGINT', shutdown);
199
+ }
200
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type Call = <T = unknown>(name: string, args?: unknown) => Promise<T>;
2
+ export type Floor = {
3
+ floor: {
4
+ id: string;
5
+ fencingToken: string;
6
+ };
7
+ snapshot: {
8
+ revision: string;
9
+ };
10
+ page: {
11
+ text?: string;
12
+ note?: unknown;
13
+ };
14
+ nextCursor?: string | null;
15
+ };
16
+ export declare const credential: (floor: Floor) => {
17
+ id: string;
18
+ fencingToken: string;
19
+ };
20
+ export declare function take(args: string[], name: string): string | undefined;
21
+ export declare function booleanFlag(args: string[], name: string): boolean;
22
+ export declare function acquire(call: Call, type: 'note' | 'thread', id: string): Promise<Floor>;
23
+ export declare function release(call: Call, floor: Floor): Promise<void>;
24
+ export declare function mutation(call: Call, type: 'note' | 'thread', id: string, value: Record<string, unknown>): Promise<unknown>;
25
+ export declare function runNoteCli(action: string | undefined, args: string[], call: Call, dataDir: string): Promise<{
26
+ value?: unknown;
27
+ raw?: string;
28
+ }>;
@@ -0,0 +1,204 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { BassfishError, requireThat } from './domain.js';
5
+ export const credential = (floor) => ({ id: floor.floor.id, fencingToken: floor.floor.fencingToken });
6
+ export function take(args, name) {
7
+ const index = args.indexOf(name);
8
+ if (index < 0)
9
+ return undefined;
10
+ const value = args[index + 1];
11
+ requireThat(value !== undefined && !value.startsWith('--'), 'INVALID_ARGUMENT', `${name} requires a value.`);
12
+ args.splice(index, 2);
13
+ return value;
14
+ }
15
+ function takeAll(args, name) { const output = []; let value; while ((value = take(args, name)) !== undefined)
16
+ output.push(value); return output; }
17
+ export function booleanFlag(args, name) { const index = args.indexOf(name); if (index < 0)
18
+ return false; args.splice(index, 1); return true; }
19
+ async function stdin() { const chunks = []; for await (const chunk of process.stdin)
20
+ chunks.push(Buffer.from(chunk)); return Buffer.concat(chunks).toString('utf8'); }
21
+ async function edit(dataDir, initial) {
22
+ const editor = process.env.VISUAL ?? process.env.EDITOR;
23
+ requireThat(editor, 'EDITOR_UNAVAILABLE', 'Set VISUAL or EDITOR to an executable path.');
24
+ const directory = await mkdtemp(join(dataDir, 'editor-'));
25
+ const path = join(directory, 'note.md');
26
+ try {
27
+ await chmod(directory, 0o700);
28
+ await writeFile(path, initial, { mode: 0o600 });
29
+ const code = await new Promise((resolve, reject) => { const child = spawn(editor, [path], { stdio: 'inherit' }); child.once('error', reject); child.once('exit', resolve); });
30
+ requireThat(code === 0, 'EDITOR_FAILED', 'The editor exited without saving successfully.');
31
+ return await readFile(path, 'utf8');
32
+ }
33
+ finally {
34
+ await rm(directory, { recursive: true, force: true });
35
+ }
36
+ }
37
+ async function source(args, dataDir, initial = '') {
38
+ const file = take(args, '--file');
39
+ const useEditor = booleanFlag(args, '--editor');
40
+ requireThat((file === undefined ? 0 : 1) + (useEditor ? 1 : 0) === 1, 'INVALID_ARGUMENT', 'Choose exactly one of --file PATH, --file -, or --editor.');
41
+ if (useEditor)
42
+ return edit(dataDir, initial);
43
+ return file === '-' ? stdin() : readFile(file, 'utf8');
44
+ }
45
+ export async function acquire(call, type, id) {
46
+ const ticket = await call('requestFloor', { target: { type, id } });
47
+ if (ticket.state !== 'offered') {
48
+ await call('cancelFloorRequest', { requestId: ticket.requestId });
49
+ throw new BassfishError('FLOOR_BUSY', `${type === 'note' ? 'Note' : 'Thread'} is busy. This request was cancelled, not retried.`);
50
+ }
51
+ return call('claimFloor', { offerId: ticket.offerId });
52
+ }
53
+ export async function release(call, floor) { await call('releaseFloor', { floor: credential(floor) }); }
54
+ async function fullNote(call, floor) {
55
+ let text = floor.page.text ?? '';
56
+ let cursor = floor.nextCursor;
57
+ const note = floor.page.note;
58
+ while (cursor) {
59
+ const page = await call('readFloor', { floor: credential(floor), cursor });
60
+ text += page.page.text ?? '';
61
+ cursor = page.nextCursor;
62
+ }
63
+ return { text, note };
64
+ }
65
+ export async function mutation(call, type, id, value) {
66
+ const floor = await acquire(call, type, id);
67
+ let consumed = false;
68
+ try {
69
+ const result = await call('commitFloor', { floor: credential(floor), baseRevision: floor.snapshot.revision, mutation: value });
70
+ consumed = true;
71
+ return result;
72
+ }
73
+ finally {
74
+ if (!consumed)
75
+ await release(call, floor).catch(() => { });
76
+ }
77
+ }
78
+ export async function runNoteCli(action, args, call, dataDir) {
79
+ await mkdir(dataDir, { recursive: true, mode: 0o700 });
80
+ if (action === 'list') {
81
+ const state = booleanFlag(args, '--archived') ? 'archived' : booleanFlag(args, '--deleted') ? 'deleted' : 'active';
82
+ const input = { state, pathPrefix: take(args, '--path-prefix'), label: take(args, '--label'), noteKind: take(args, '--kind') };
83
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown note list argument.');
84
+ return { value: await call('listNotes', input) };
85
+ }
86
+ if (action === 'create') {
87
+ const path = args.shift();
88
+ const title = take(args, '--title');
89
+ requireThat(path && title, 'INVALID_ARGUMENT', 'Use note create PATH --title TITLE with a body source.');
90
+ const body = await source(args, dataDir);
91
+ const labels = (take(args, '--labels') ?? '').split(',').filter(Boolean);
92
+ const noteKind = take(args, '--kind') ?? null;
93
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown note create argument.');
94
+ return { value: await call('createNote', { path, title, body, labels, noteKind, links: [] }) };
95
+ }
96
+ const id = args.shift();
97
+ requireThat(id, 'INVALID_ARGUMENT', 'Pass a note ID.');
98
+ if (action === 'show') {
99
+ const json = booleanFlag(args, '--json');
100
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown note show argument.');
101
+ const floor = await acquire(call, 'note', id);
102
+ try {
103
+ const note = await fullNote(call, floor);
104
+ return json ? { value: note } : { raw: note.text };
105
+ }
106
+ finally {
107
+ await release(call, floor);
108
+ }
109
+ }
110
+ if (action === 'edit' && args.includes('--editor')) {
111
+ const first = await acquire(call, 'note', id);
112
+ const original = await fullNote(call, first);
113
+ await release(call, first);
114
+ const body = await source(args, dataDir, original.text);
115
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown note edit argument.');
116
+ const second = await acquire(call, 'note', id);
117
+ let consumed = false;
118
+ try {
119
+ const latest = await fullNote(call, second);
120
+ requireThat(latest.text === original.text, 'EDIT_CONFLICT', 'The note changed while the editor was open; no write was attempted.');
121
+ const value = await call('commitFloor', { floor: credential(second), baseRevision: second.snapshot.revision, mutation: { kind: 'replaceNoteBody', body } });
122
+ consumed = true;
123
+ return { value };
124
+ }
125
+ finally {
126
+ if (!consumed)
127
+ await release(call, second).catch(() => { });
128
+ }
129
+ }
130
+ if (['edit', 'append', 'prepend', 'patch'].includes(action ?? '')) {
131
+ const body = await source(args, dataDir);
132
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', `Unknown note ${action} argument.`);
133
+ const kind = action === 'edit' ? 'replaceNoteBody' : action === 'append' ? 'appendNoteBody' : action === 'prepend' ? 'prependNoteBody' : 'patchNoteBody';
134
+ return { value: await mutation(call, 'note', id, { kind, [action === 'patch' ? 'patch' : 'body']: body }) };
135
+ }
136
+ if (action === 'move') {
137
+ const path = args.shift();
138
+ requireThat(path && args.length === 0, 'INVALID_ARGUMENT', 'Use note move NOTE_ID PATH.');
139
+ return { value: await mutation(call, 'note', id, { kind: 'moveNote', path }) };
140
+ }
141
+ if (action === 'metadata') {
142
+ const title = take(args, '--title');
143
+ const labelsValue = take(args, '--labels');
144
+ const kindValue = take(args, '--kind');
145
+ const clearKind = booleanFlag(args, '--clear-kind');
146
+ requireThat(!(kindValue && clearKind) && args.length === 0, 'INVALID_ARGUMENT', 'Invalid note metadata arguments.');
147
+ const value = { kind: 'setNoteMetadata', ...(title ? { title } : {}), ...(labelsValue !== undefined ? { labels: labelsValue.split(',').filter(Boolean) } : {}), ...(kindValue ? { noteKind: kindValue } : clearKind ? { noteKind: null } : {}) };
148
+ requireThat(Object.keys(value).length > 1, 'INVALID_ARGUMENT', 'Provide metadata to change.');
149
+ return { value: await mutation(call, 'note', id, value) };
150
+ }
151
+ if (action === 'links') {
152
+ const links = takeAll(args, '--link').map(value => { const at = value.indexOf(':'); requireThat(at > 0, 'INVALID_ARGUMENT', 'Links use TYPE:ID.'); return { targetType: value.slice(0, at), targetId: value.slice(at + 1) }; });
153
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown note links argument.');
154
+ return { value: await mutation(call, 'note', id, { kind: 'setLinks', links }) };
155
+ }
156
+ if (action === 'replace-text') {
157
+ const find = take(args, '--find');
158
+ const replace = take(args, '--replace') ?? '';
159
+ const expectedOccurrences = Number(take(args, '--expect'));
160
+ requireThat(find && Number.isInteger(expectedOccurrences) && args.length === 0, 'INVALID_ARGUMENT', 'Use --find, --replace, and --expect N.');
161
+ return { value: await mutation(call, 'note', id, { kind: 'replaceNoteText', find, replace, expectedOccurrences }) };
162
+ }
163
+ if (action === 'section') {
164
+ const heading = take(args, '--heading');
165
+ const occurrenceRaw = take(args, '--occurrence');
166
+ const createIfMissing = booleanFlag(args, '--create');
167
+ requireThat(heading, 'INVALID_ARGUMENT', 'Use --heading A/B.');
168
+ const body = await source(args, dataDir);
169
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown note section argument.');
170
+ return { value: await mutation(call, 'note', id, { kind: 'upsertNoteSection', headingPath: heading.split('/').filter(Boolean), body, ...(occurrenceRaw ? { occurrence: Number(occurrenceRaw) } : {}), createIfMissing }) };
171
+ }
172
+ if (['archive', 'delete', 'activate'].includes(action ?? '')) {
173
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', `Unknown note ${action} argument.`);
174
+ return { value: await mutation(call, 'note', id, { kind: `${action}Note` }) };
175
+ }
176
+ if (action === 'history') {
177
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown note history argument.');
178
+ const floor = await acquire(call, 'note', id);
179
+ try {
180
+ return { value: await call('listHistory', { floor: credential(floor), limit: 100, offset: 0 }) };
181
+ }
182
+ finally {
183
+ await release(call, floor);
184
+ }
185
+ }
186
+ if (action === 'restore') {
187
+ const revision = args.shift();
188
+ requireThat(revision && booleanFlag(args, '--yes') && args.length === 0, 'INVALID_ARGUMENT', 'Use note restore NOTE_ID REVISION --yes.');
189
+ const floor = await acquire(call, 'note', id);
190
+ let consumed = false;
191
+ try {
192
+ const preview = await call('previewRestore', { floor: credential(floor), revision });
193
+ const value = await call('restoreRevision', { floor: credential(floor), previewToken: preview.previewToken });
194
+ consumed = true;
195
+ return { value };
196
+ }
197
+ finally {
198
+ if (!consumed)
199
+ await release(call, floor).catch(() => { });
200
+ }
201
+ }
202
+ throw new BassfishError('INVALID_ARGUMENT', 'Unknown note command.');
203
+ }
204
+ //# sourceMappingURL=note-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note-cli.js","sourceRoot":"","sources":["../src/note-cli.ts"],"names":[],"mappings":"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"}
package/dist/note.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import type { Actor, Note, NoteMutation, ResourceLink } from './domain.js';
2
+ export declare const normalizeLabels: (labels: string[]) => string[];
3
+ export declare const normalizeLinks: (links: ResourceLink[]) => ResourceLink[];
4
+ export interface OutlineItem {
5
+ level: number;
6
+ heading: string;
7
+ path: string[];
8
+ startLine: number;
9
+ endLine: number;
10
+ }
11
+ export declare function outline(body: string): OutlineItem[];
12
+ export declare function prepareNote(note: Note, mutation: NoteMutation, actor: Actor, at: string): Note;