@amalgm/live 0.1.0 → 0.1.1
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/PURPOSE.md +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/workspace/api.d.ts +7 -0
- package/dist/workspace/api.d.ts.map +1 -0
- package/dist/workspace/api.js +64 -0
- package/dist/workspace/api.js.map +1 -0
- package/dist/workspace/identity.d.ts +5 -0
- package/dist/workspace/identity.d.ts.map +1 -0
- package/dist/workspace/identity.js +27 -0
- package/dist/workspace/identity.js.map +1 -0
- package/dist/workspace/index.d.ts +8 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +5 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/memory-store.d.ts +9 -0
- package/dist/workspace/memory-store.d.ts.map +1 -0
- package/dist/workspace/memory-store.js +17 -0
- package/dist/workspace/memory-store.js.map +1 -0
- package/dist/workspace/registry.d.ts +21 -0
- package/dist/workspace/registry.d.ts.map +1 -0
- package/dist/workspace/registry.js +94 -0
- package/dist/workspace/registry.js.map +1 -0
- package/dist/workspace/types.d.ts +51 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +2 -0
- package/dist/workspace/types.js.map +1 -0
- package/package.json +5 -1
package/PURPOSE.md
CHANGED
|
@@ -54,6 +54,10 @@ its cutover.
|
|
|
54
54
|
by module, deleting their duplicated copy in the same change.
|
|
55
55
|
10. **Amalgm's own surfaces use this SDK.** A private shortcut in the Amalgm
|
|
56
56
|
UI or runtime means the SDK is incomplete — fix the SDK, not the caller.
|
|
57
|
+
11. **A workspace has one portable identity.** Its UUIDv7 and computer URI
|
|
58
|
+
survive renames and rediscovery; local paths locate it but never become a
|
|
59
|
+
second identity, and every registry change emits both legacy `projects`
|
|
60
|
+
and canonical `workspaces` resource events.
|
|
57
61
|
|
|
58
62
|
## Five surfaces, one behavior
|
|
59
63
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { WorkspaceRegistry } from './registry.js';
|
|
2
|
+
export interface WorkspaceApiOptions {
|
|
3
|
+
readonly workspaceRoot: string;
|
|
4
|
+
readonly branchForPath?: (path: string) => Promise<string | null>;
|
|
5
|
+
}
|
|
6
|
+
export declare function createWorkspaceApi(registry: WorkspaceRegistry, options: WorkspaceApiOptions): (request: Request) => Promise<Response>;
|
|
7
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/workspace/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACnE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,mBAAmB,GAC3B,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA2CzC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { WorkspaceRegistry } from './registry.js';
|
|
2
|
+
export function createWorkspaceApi(registry, options) {
|
|
3
|
+
return async (request) => {
|
|
4
|
+
const url = new URL(request.url);
|
|
5
|
+
if (request.method === 'GET' && (url.pathname === '/workspace' || url.pathname === '/workspace/projects')) {
|
|
6
|
+
const projects = await Promise.all(registry.list().map(async (workspace) => ({
|
|
7
|
+
...workspace,
|
|
8
|
+
branch: options.branchForPath ? await options.branchForPath(workspace.path) : null,
|
|
9
|
+
})));
|
|
10
|
+
return json(200, { projects, workspaceRoot: options.workspaceRoot });
|
|
11
|
+
}
|
|
12
|
+
if (request.method === 'POST' && (url.pathname === '/workspace/projects' || url.pathname === '/workspace/import')) {
|
|
13
|
+
return mutate(async () => {
|
|
14
|
+
const body = await request.json();
|
|
15
|
+
const path = body.path ?? body.source_path;
|
|
16
|
+
const name = body.name ?? body.project_name;
|
|
17
|
+
const workspace = registry.register({
|
|
18
|
+
path: typeof path === 'string' ? path : '',
|
|
19
|
+
...(typeof name === 'string' ? { name } : {}),
|
|
20
|
+
source: typeof body.source === 'string' ? body.source : 'computer',
|
|
21
|
+
...(body.managed === undefined ? {} : { managed: Boolean(body.managed) }),
|
|
22
|
+
}, url.pathname.endsWith('/import') ? 'workspace:import' : 'workspace:register');
|
|
23
|
+
return { success: true, workspace, path: workspace.path, name: workspace.name, workspaceRoot: options.workspaceRoot };
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (request.method === 'PATCH' && url.pathname === '/workspace/projects') {
|
|
27
|
+
return mutate(async () => {
|
|
28
|
+
const body = await request.json();
|
|
29
|
+
const identifier = body.id ?? body.path;
|
|
30
|
+
if (typeof identifier !== 'string' || !identifier)
|
|
31
|
+
throw new Error('id or path is required');
|
|
32
|
+
const workspace = registry.rename(identifier, body.name);
|
|
33
|
+
return { success: true, workspace, path: workspace.path, name: workspace.name };
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (request.method === 'DELETE' && url.pathname === '/workspace/projects') {
|
|
37
|
+
return mutate(async () => {
|
|
38
|
+
const body = await request.json();
|
|
39
|
+
const identifier = body.id ?? body.path;
|
|
40
|
+
if (typeof identifier !== 'string' || !identifier)
|
|
41
|
+
throw new Error('id or path is required');
|
|
42
|
+
return { success: true, workspace: registry.remove(identifier) };
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return json(404, { error: 'not found' });
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async function mutate(run) {
|
|
49
|
+
try {
|
|
50
|
+
return json(200, await run());
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const message = error instanceof Error ? error.message : 'Workspace request failed';
|
|
54
|
+
const status = message === 'Workspace not found' ? 404 : 400;
|
|
55
|
+
return json(status, { error: message });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function json(status, body) {
|
|
59
|
+
return new Response(JSON.stringify(body), {
|
|
60
|
+
status,
|
|
61
|
+
headers: { 'content-type': 'application/json', 'cache-control': 'no-store' },
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/workspace/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Engine reference: runtime/scripts/amalgm-mcp/workspace/tree/identity.js. */
|
|
2
|
+
export declare function isUuidV7(value: unknown): value is string;
|
|
3
|
+
export declare function uuidV7(now: number, randomBytes: (length: number) => Uint8Array): string;
|
|
4
|
+
export declare function workspaceUriForPath(localPath: string, computerId: string): string;
|
|
5
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/workspace/identity.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,GAAG,MAAM,CAevF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGjF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const UUID_V7 = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
2
|
+
/** Engine reference: runtime/scripts/amalgm-mcp/workspace/tree/identity.js. */
|
|
3
|
+
export function isUuidV7(value) {
|
|
4
|
+
return typeof value === 'string' && UUID_V7.test(value);
|
|
5
|
+
}
|
|
6
|
+
export function uuidV7(now, randomBytes) {
|
|
7
|
+
if (!Number.isSafeInteger(now) || now < 0 || now > 0xffffffffffff) {
|
|
8
|
+
throw new TypeError('UUIDv7 timestamp must be an integer between 0 and 2^48 - 1');
|
|
9
|
+
}
|
|
10
|
+
const bytes = Uint8Array.from(randomBytes(16));
|
|
11
|
+
if (bytes.length !== 16)
|
|
12
|
+
throw new TypeError('UUIDv7 random source must return 16 bytes');
|
|
13
|
+
let timestamp = BigInt(now);
|
|
14
|
+
for (let index = 5; index >= 0; index -= 1) {
|
|
15
|
+
bytes[index] = Number(timestamp & 0xffn);
|
|
16
|
+
timestamp >>= 8n;
|
|
17
|
+
}
|
|
18
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x70;
|
|
19
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
20
|
+
const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
21
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
22
|
+
}
|
|
23
|
+
export function workspaceUriForPath(localPath, computerId) {
|
|
24
|
+
const encodedPath = localPath.split(/[\\/]/).map(encodeURIComponent).join('/');
|
|
25
|
+
return `computer://${encodeURIComponent(computerId || 'local-computer')}${encodedPath.startsWith('/') ? '' : '/'}${encodedPath}`;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/workspace/identity.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,wEAAwE,CAAC;AAEzF,+EAA+E;AAC/E,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,WAA2C;IAC7E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,cAAc,EAAE,CAAC;QAClE,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;IAC1F,IAAI,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;QACzC,SAAS,KAAK,EAAE,CAAC;IACnB,CAAC;IACD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7G,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,UAAkB;IACvE,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/E,OAAO,cAAc,kBAAkB,CAAC,UAAU,IAAI,gBAAgB,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC;AACnI,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createWorkspaceApi } from './api.js';
|
|
2
|
+
export type { WorkspaceApiOptions } from './api.js';
|
|
3
|
+
export { isUuidV7, uuidV7, workspaceUriForPath } from './identity.js';
|
|
4
|
+
export { MemoryWorkspaceStore } from './memory-store.js';
|
|
5
|
+
export { WorkspaceRegistry } from './registry.js';
|
|
6
|
+
export type { WorkspaceRegistryOptions } from './registry.js';
|
|
7
|
+
export type * from './types.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAC9D,mBAAmB,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WorkspaceRecord, WorkspaceStore } from './types.js';
|
|
2
|
+
export declare class MemoryWorkspaceStore implements WorkspaceStore {
|
|
3
|
+
#private;
|
|
4
|
+
list(): readonly WorkspaceRecord[];
|
|
5
|
+
find(identifier: string): WorkspaceRecord | null;
|
|
6
|
+
put(workspace: WorkspaceRecord): void;
|
|
7
|
+
delete(id: string): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=memory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/workspace/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAElE,qBAAa,oBAAqB,YAAW,cAAc;;IAGzD,IAAI,IAAI,SAAS,eAAe,EAAE;IAKlC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAKhD,GAAG,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAIrC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAGzB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class MemoryWorkspaceStore {
|
|
2
|
+
#records = new Map();
|
|
3
|
+
list() {
|
|
4
|
+
return [...this.#records.values()]
|
|
5
|
+
.sort((left, right) => left.name.localeCompare(right.name) || left.path.localeCompare(right.path));
|
|
6
|
+
}
|
|
7
|
+
find(identifier) {
|
|
8
|
+
return [...this.#records.values()].find((record) => record.id === identifier || record.path === identifier || record.uri === identifier) ?? null;
|
|
9
|
+
}
|
|
10
|
+
put(workspace) {
|
|
11
|
+
this.#records.set(workspace.id, workspace);
|
|
12
|
+
}
|
|
13
|
+
delete(id) {
|
|
14
|
+
this.#records.delete(id);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/workspace/memory-store.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,oBAAoB;IACtB,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEvD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;aAC/B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACvG,CAAC;IAED,IAAI,CAAC,UAAkB;QACrB,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACjD,MAAM,CAAC,EAAE,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC,IAAI,IAAI,CAAC;IACjG,CAAC;IAED,GAAG,CAAC,SAA0B;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { WorkspaceEvent, WorkspaceInput, WorkspacePathPort, WorkspaceRecord, WorkspaceStore } from './types.js';
|
|
2
|
+
export interface WorkspaceRegistryOptions {
|
|
3
|
+
readonly store: WorkspaceStore;
|
|
4
|
+
readonly paths: WorkspacePathPort;
|
|
5
|
+
readonly computerId?: string;
|
|
6
|
+
readonly workspaceRoot?: string;
|
|
7
|
+
readonly now: () => Date;
|
|
8
|
+
readonly randomBytes: (length: number) => Uint8Array;
|
|
9
|
+
readonly onEvent?: (event: WorkspaceEvent) => void;
|
|
10
|
+
}
|
|
11
|
+
/** Engine reference: runtime/scripts/amalgm-mcp/workspace/store.js. */
|
|
12
|
+
export declare class WorkspaceRegistry {
|
|
13
|
+
#private;
|
|
14
|
+
constructor(options: WorkspaceRegistryOptions);
|
|
15
|
+
list(): readonly WorkspaceRecord[];
|
|
16
|
+
register(input: WorkspaceInput, source?: string): WorkspaceRecord;
|
|
17
|
+
import(input: WorkspaceInput, source?: string): WorkspaceRecord;
|
|
18
|
+
rename(identifier: string, nameInput: unknown, source?: string): WorkspaceRecord;
|
|
19
|
+
remove(identifier: string, source?: string): WorkspaceRecord | null;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/workspace/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACpD;AAED,uEAAuE;AACvE,qBAAa,iBAAiB;;gBAGhB,OAAO,EAAE,wBAAwB;IAI7C,IAAI,IAAI,SAAS,eAAe,EAAE;IAIlC,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,SAAuB,GAAG,eAAe;IAW/E,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,SAAqB,GAAG,eAAe;IAK3E,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,SAAqB,GAAG,eAAe;IAW5F,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,SAAqB,GAAG,eAAe,GAAG,IAAI;CAqDhF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { isUuidV7, uuidV7, workspaceUriForPath } from './identity.js';
|
|
2
|
+
/** Engine reference: runtime/scripts/amalgm-mcp/workspace/store.js. */
|
|
3
|
+
export class WorkspaceRegistry {
|
|
4
|
+
#options;
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.#options = options;
|
|
7
|
+
}
|
|
8
|
+
list() {
|
|
9
|
+
return this.#options.store.list();
|
|
10
|
+
}
|
|
11
|
+
register(input, source = 'workspace:register') {
|
|
12
|
+
const path = clean(input.path);
|
|
13
|
+
if (!path)
|
|
14
|
+
throw new Error('path is required');
|
|
15
|
+
if (!this.#options.paths.isAbsolute(path))
|
|
16
|
+
throw new Error('path must be absolute');
|
|
17
|
+
const resolved = this.#options.paths.resolve(path);
|
|
18
|
+
if (!this.#options.paths.exists(resolved) || !this.#options.paths.isDirectory(resolved)) {
|
|
19
|
+
throw new Error('path must be a folder');
|
|
20
|
+
}
|
|
21
|
+
return this.#upsert({ ...input, path: resolved }, source);
|
|
22
|
+
}
|
|
23
|
+
import(input, source = 'workspace:import') {
|
|
24
|
+
const resolved = this.register(input, source);
|
|
25
|
+
return resolved;
|
|
26
|
+
}
|
|
27
|
+
rename(identifier, nameInput, source = 'workspace:update') {
|
|
28
|
+
const name = clean(nameInput);
|
|
29
|
+
if (!name)
|
|
30
|
+
throw new Error('Workspace name is required');
|
|
31
|
+
const existing = this.#options.store.find(identifier);
|
|
32
|
+
if (!existing)
|
|
33
|
+
throw new Error('Workspace not found');
|
|
34
|
+
const workspace = { ...existing, name, updatedAt: this.#nowIso() };
|
|
35
|
+
this.#options.store.put(workspace);
|
|
36
|
+
this.#publish('update', workspace, source);
|
|
37
|
+
return workspace;
|
|
38
|
+
}
|
|
39
|
+
remove(identifier, source = 'workspace:delete') {
|
|
40
|
+
const existing = this.#options.store.find(identifier);
|
|
41
|
+
if (!existing)
|
|
42
|
+
return null;
|
|
43
|
+
this.#options.store.delete(existing.id);
|
|
44
|
+
this.#publish('delete', existing, source);
|
|
45
|
+
return existing;
|
|
46
|
+
}
|
|
47
|
+
#upsert(input, source) {
|
|
48
|
+
const now = this.#nowIso();
|
|
49
|
+
const computerId = clean(input.computerId) || clean(this.#options.computerId) || 'local-computer';
|
|
50
|
+
const uri = clean(input.uri) || workspaceUriForPath(input.path, computerId);
|
|
51
|
+
const existing = this.#options.store.find(input.path) || this.#options.store.find(uri)
|
|
52
|
+
|| (isUuidV7(input.id) ? this.#options.store.find(input.id) : null);
|
|
53
|
+
const managed = input.managed !== undefined
|
|
54
|
+
? Boolean(input.managed)
|
|
55
|
+
: Boolean(this.#options.workspaceRoot && this.#options.paths.isWithin(this.#options.workspaceRoot, input.path));
|
|
56
|
+
const id = existing?.id ?? (isUuidV7(input.id)
|
|
57
|
+
? input.id.toLowerCase()
|
|
58
|
+
: uuidV7(this.#options.now().getTime(), this.#options.randomBytes));
|
|
59
|
+
const workspace = {
|
|
60
|
+
id,
|
|
61
|
+
name: clean(input.name) || this.#options.paths.basename(input.path) || 'workspace',
|
|
62
|
+
uri: existing?.uri || uri,
|
|
63
|
+
path: input.path,
|
|
64
|
+
localPath: input.path,
|
|
65
|
+
locationType: 'computer',
|
|
66
|
+
computerId,
|
|
67
|
+
source: clean(input.source) || (managed ? 'managed' : 'computer'),
|
|
68
|
+
managed,
|
|
69
|
+
status: clean(input.status) || 'ready',
|
|
70
|
+
createdAt: existing?.createdAt || now,
|
|
71
|
+
updatedAt: now,
|
|
72
|
+
location: { type: 'computer', computerId, path: input.path },
|
|
73
|
+
};
|
|
74
|
+
this.#options.store.put(workspace);
|
|
75
|
+
this.#publish(existing ? 'update' : 'insert', workspace, source);
|
|
76
|
+
return workspace;
|
|
77
|
+
}
|
|
78
|
+
#publish(op, workspace, source) {
|
|
79
|
+
for (const resource of ['workspaces', 'projects']) {
|
|
80
|
+
this.#options.onEvent?.({
|
|
81
|
+
resource, op, id: workspace.id,
|
|
82
|
+
...(op === 'delete' ? {} : { value: workspace }),
|
|
83
|
+
source,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
#nowIso() {
|
|
88
|
+
return this.#options.now().toISOString();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function clean(value) {
|
|
92
|
+
return typeof value === 'string' && value.trim() ? value.trim() : '';
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/workspace/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface WorkspaceRecord {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly uri: string;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly localPath: string;
|
|
7
|
+
readonly locationType: 'computer';
|
|
8
|
+
readonly computerId: string;
|
|
9
|
+
readonly source: string;
|
|
10
|
+
readonly managed: boolean;
|
|
11
|
+
readonly status: string;
|
|
12
|
+
readonly createdAt: string;
|
|
13
|
+
readonly updatedAt: string;
|
|
14
|
+
readonly location: {
|
|
15
|
+
readonly type: 'computer';
|
|
16
|
+
readonly computerId: string;
|
|
17
|
+
readonly path: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface WorkspaceInput {
|
|
21
|
+
readonly id?: string;
|
|
22
|
+
readonly name?: string;
|
|
23
|
+
readonly uri?: string;
|
|
24
|
+
readonly path: string;
|
|
25
|
+
readonly computerId?: string;
|
|
26
|
+
readonly source?: string;
|
|
27
|
+
readonly managed?: boolean;
|
|
28
|
+
readonly status?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface WorkspaceStore {
|
|
31
|
+
list(): readonly WorkspaceRecord[];
|
|
32
|
+
find(identifier: string): WorkspaceRecord | null;
|
|
33
|
+
put(workspace: WorkspaceRecord): void;
|
|
34
|
+
delete(id: string): void;
|
|
35
|
+
}
|
|
36
|
+
export interface WorkspacePathPort {
|
|
37
|
+
isAbsolute(path: string): boolean;
|
|
38
|
+
resolve(path: string): string;
|
|
39
|
+
basename(path: string): string;
|
|
40
|
+
exists(path: string): boolean;
|
|
41
|
+
isDirectory(path: string): boolean;
|
|
42
|
+
isWithin(root: string, path: string): boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface WorkspaceEvent {
|
|
45
|
+
readonly resource: 'projects' | 'workspaces';
|
|
46
|
+
readonly op: 'insert' | 'update' | 'delete';
|
|
47
|
+
readonly id: string;
|
|
48
|
+
readonly value?: WorkspaceRecord;
|
|
49
|
+
readonly source: string;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workspace/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;QAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,SAAS,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;IACjD,GAAG,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,YAAY,CAAC;IAC7C,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workspace/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amalgm/live",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Portable realtime SDK for Amalgm — wire contracts, mutation discipline, and delivery state machines behind host-injected adapters.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -27,6 +27,10 @@
|
|
|
27
27
|
"./adapters": {
|
|
28
28
|
"types": "./dist/adapters/index.d.ts",
|
|
29
29
|
"default": "./dist/adapters/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./workspace": {
|
|
32
|
+
"types": "./dist/workspace/index.d.ts",
|
|
33
|
+
"default": "./dist/workspace/index.js"
|
|
30
34
|
}
|
|
31
35
|
},
|
|
32
36
|
"files": [
|