@dxos/cli-util 0.8.4-main.d05673bc65 → 0.8.4-main.fcc0d83b33
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/dist/lib/node-esm/{chunk-6TKUDRM6.mjs → chunk-N5LOOWPE.mjs} +1 -1
- package/dist/lib/node-esm/index.mjs +105 -67
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +2 -2
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/types/src/testing/test-console.d.ts.map +1 -1
- package/dist/types/src/testing/test-layer.d.ts +1 -1
- package/dist/types/src/testing/test-layer.d.ts.map +1 -1
- package/dist/types/src/util/form-builder.d.ts +1 -1
- package/dist/types/src/util/form-builder.d.ts.map +1 -1
- package/dist/types/src/util/options.d.ts.map +1 -1
- package/dist/types/src/util/platform.d.ts.map +1 -1
- package/dist/types/src/util/printer.d.ts.map +1 -1
- package/dist/types/src/util/space-format.d.ts +13 -2
- package/dist/types/src/util/space-format.d.ts.map +1 -1
- package/dist/types/src/util/space.d.ts +8 -8
- package/dist/types/src/util/space.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -14
- package/src/testing/test-console.ts +1 -2
- package/src/testing/test-layer.ts +0 -1
- package/src/util/form-builder.ts +1 -1
- package/src/util/platform.ts +1 -2
- package/src/util/printer.ts +1 -1
- package/src/util/space-format.ts +86 -12
- package/src/util/space.ts +42 -28
- /package/dist/lib/node-esm/{chunk-6TKUDRM6.mjs.map → chunk-N5LOOWPE.mjs.map} +0 -0
|
@@ -2,7 +2,7 @@ import { createRequire } from 'node:module';const require = createRequire(import
|
|
|
2
2
|
import {
|
|
3
3
|
CommandConfig,
|
|
4
4
|
__export
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-N5LOOWPE.mjs";
|
|
6
6
|
|
|
7
7
|
// src/util/form-builder.ts
|
|
8
8
|
var form_builder_exports = {};
|
|
@@ -16,8 +16,8 @@ __export(form_builder_exports, {
|
|
|
16
16
|
set: () => set,
|
|
17
17
|
when: () => when
|
|
18
18
|
});
|
|
19
|
-
import * as Doc from "@effect/printer/Doc";
|
|
20
19
|
import * as Ansi from "@effect/printer-ansi/Ansi";
|
|
20
|
+
import * as Doc from "@effect/printer/Doc";
|
|
21
21
|
import * as Option from "effect/Option";
|
|
22
22
|
import * as Pipeable from "effect/Pipeable";
|
|
23
23
|
var FormBuilderImpl = class {
|
|
@@ -44,16 +44,16 @@ var calculateDimensions = (entries, prefix) => {
|
|
|
44
44
|
var buildKeyLine = (prefix, key, targetWidth) => {
|
|
45
45
|
return Doc.annotate(Doc.fill(targetWidth)(Doc.text(prefix + key + ": ")), Ansi.blackBright);
|
|
46
46
|
};
|
|
47
|
-
var setImpl = (builder, key,
|
|
48
|
-
if (
|
|
47
|
+
var setImpl = (builder, key, value, color) => {
|
|
48
|
+
if (value !== void 0) {
|
|
49
49
|
let valueDoc;
|
|
50
|
-
if (typeof
|
|
51
|
-
valueDoc =
|
|
50
|
+
if (typeof value === "object" && value !== null) {
|
|
51
|
+
valueDoc = value;
|
|
52
52
|
} else {
|
|
53
|
-
valueDoc = Doc.text(String(
|
|
53
|
+
valueDoc = Doc.text(String(value));
|
|
54
54
|
}
|
|
55
55
|
if (color) {
|
|
56
|
-
const ansi = typeof color === "function" ? color(
|
|
56
|
+
const ansi = typeof color === "function" ? color(value) : color;
|
|
57
57
|
valueDoc = Doc.annotate(valueDoc, ansi);
|
|
58
58
|
}
|
|
59
59
|
builder.entries.push({
|
|
@@ -68,13 +68,13 @@ function set(builderOrKey, keyOrValue, valueOrColor, color) {
|
|
|
68
68
|
if (builderOrKey instanceof FormBuilderImpl) {
|
|
69
69
|
const builder = builderOrKey;
|
|
70
70
|
const key = keyOrValue;
|
|
71
|
-
const
|
|
72
|
-
return setImpl(builder, key,
|
|
71
|
+
const value = valueOrColor;
|
|
72
|
+
return setImpl(builder, key, value, color);
|
|
73
73
|
} else {
|
|
74
74
|
const key = builderOrKey;
|
|
75
|
-
const
|
|
75
|
+
const value = keyOrValue;
|
|
76
76
|
const color2 = valueOrColor;
|
|
77
|
-
return (builder) => setImpl(builder, key,
|
|
77
|
+
return (builder) => setImpl(builder, key, value, color2);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
var nestImpl = (parent, key, builder) => {
|
|
@@ -103,9 +103,9 @@ function nest(parentOrKey, keyOrBuilder, builder) {
|
|
|
103
103
|
return (parent) => nestImpl(parent, key, builder2);
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
|
-
var optionImpl = (builder, key,
|
|
107
|
-
if (Option.isSome(
|
|
108
|
-
return setImpl(builder, key,
|
|
106
|
+
var optionImpl = (builder, key, value, color) => {
|
|
107
|
+
if (Option.isSome(value)) {
|
|
108
|
+
return setImpl(builder, key, value.value, color);
|
|
109
109
|
}
|
|
110
110
|
return builder;
|
|
111
111
|
};
|
|
@@ -113,30 +113,30 @@ function option(builderOrKey, keyOrValue, valueOrColor, color) {
|
|
|
113
113
|
if (builderOrKey instanceof FormBuilderImpl) {
|
|
114
114
|
const builder = builderOrKey;
|
|
115
115
|
const key = keyOrValue;
|
|
116
|
-
const
|
|
117
|
-
return optionImpl(builder, key,
|
|
116
|
+
const value = valueOrColor;
|
|
117
|
+
return optionImpl(builder, key, value, color);
|
|
118
118
|
} else {
|
|
119
119
|
const key = builderOrKey;
|
|
120
|
-
const
|
|
120
|
+
const value = keyOrValue;
|
|
121
121
|
const color2 = valueOrColor;
|
|
122
|
-
return (builder) => optionImpl(builder, key,
|
|
122
|
+
return (builder) => optionImpl(builder, key, value, color2);
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
|
-
var nestedOptionImpl = (builder, key,
|
|
126
|
-
if (Option.isSome(
|
|
127
|
-
return nestImpl(builder, key,
|
|
125
|
+
var nestedOptionImpl = (builder, key, value) => {
|
|
126
|
+
if (Option.isSome(value)) {
|
|
127
|
+
return nestImpl(builder, key, value.value);
|
|
128
128
|
}
|
|
129
129
|
return builder;
|
|
130
130
|
};
|
|
131
|
-
function nestedOption(builderOrKey, keyOrValue,
|
|
131
|
+
function nestedOption(builderOrKey, keyOrValue, value) {
|
|
132
132
|
if (builderOrKey instanceof FormBuilderImpl) {
|
|
133
133
|
const builder = builderOrKey;
|
|
134
134
|
const key = keyOrValue;
|
|
135
|
-
return nestedOptionImpl(builder, key,
|
|
135
|
+
return nestedOptionImpl(builder, key, value);
|
|
136
136
|
} else {
|
|
137
137
|
const key = builderOrKey;
|
|
138
|
-
const
|
|
139
|
-
return (builder) => nestedOptionImpl(builder, key,
|
|
138
|
+
const value2 = keyOrValue;
|
|
139
|
+
return (builder) => nestedOptionImpl(builder, key, value2);
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
var whenImpl = (builder, condition, ...ops) => {
|
|
@@ -179,18 +179,18 @@ function each(builderOrItems, itemsOrFn, fn3) {
|
|
|
179
179
|
var build = (builder) => {
|
|
180
180
|
const { targetWidth } = calculateDimensions(builder.entries, builder.prefix);
|
|
181
181
|
const entryLines = [];
|
|
182
|
-
builder.entries.forEach(({ key, value
|
|
182
|
+
builder.entries.forEach(({ key, value, isNested }) => {
|
|
183
183
|
const keyLine = buildKeyLine(builder.prefix, key, targetWidth);
|
|
184
184
|
if (isNested) {
|
|
185
185
|
entryLines.push(Doc.hcat([
|
|
186
186
|
keyLine,
|
|
187
187
|
Doc.hardLine,
|
|
188
|
-
|
|
188
|
+
value
|
|
189
189
|
]));
|
|
190
190
|
} else {
|
|
191
191
|
entryLines.push(Doc.hcat([
|
|
192
192
|
keyLine,
|
|
193
|
-
|
|
193
|
+
value
|
|
194
194
|
]));
|
|
195
195
|
}
|
|
196
196
|
});
|
|
@@ -213,8 +213,8 @@ var Common = {
|
|
|
213
213
|
};
|
|
214
214
|
|
|
215
215
|
// src/util/platform.ts
|
|
216
|
-
import { spawn } from "node:child_process";
|
|
217
216
|
import * as Effect from "effect/Effect";
|
|
217
|
+
import { spawn } from "node:child_process";
|
|
218
218
|
var copyToClipboard = (text3) => Effect.tryPromise({
|
|
219
219
|
try: () => {
|
|
220
220
|
return new Promise((resolve, reject) => {
|
|
@@ -303,8 +303,8 @@ var openBrowser = (url) => Effect.tryPromise({
|
|
|
303
303
|
});
|
|
304
304
|
|
|
305
305
|
// src/util/printer.ts
|
|
306
|
-
import * as Doc2 from "@effect/printer/Doc";
|
|
307
306
|
import * as AnsiDoc from "@effect/printer-ansi/AnsiDoc";
|
|
307
|
+
import * as Doc2 from "@effect/printer/Doc";
|
|
308
308
|
var print = (doc) => AnsiDoc.render(doc, {
|
|
309
309
|
style: "pretty"
|
|
310
310
|
});
|
|
@@ -324,12 +324,12 @@ var withTypes = (...types) => Effect2.gen(function* () {
|
|
|
324
324
|
import * as Console from "effect/Console";
|
|
325
325
|
import * as Effect3 from "effect/Effect";
|
|
326
326
|
import * as Layer from "effect/Layer";
|
|
327
|
-
import * as Match from "effect/Match";
|
|
328
327
|
import * as Option2 from "effect/Option";
|
|
328
|
+
import { getPersonalSpace } from "@dxos/app-toolkit";
|
|
329
329
|
import { ClientService as ClientService2 } from "@dxos/client";
|
|
330
|
+
import { QueueService } from "@dxos/compute";
|
|
330
331
|
import { Database } from "@dxos/echo";
|
|
331
332
|
import { BaseError } from "@dxos/errors";
|
|
332
|
-
import { QueueService } from "@dxos/functions";
|
|
333
333
|
import { log as log2 } from "@dxos/log";
|
|
334
334
|
import { EdgeReplicationSetting } from "@dxos/protocols/proto/dxos/echo/metadata";
|
|
335
335
|
import { isBun } from "@dxos/util";
|
|
@@ -340,33 +340,43 @@ var getSpace = (spaceId) => Effect3.gen(function* () {
|
|
|
340
340
|
}).pipe(Effect3.catchTag("NoSuchElementException", () => Effect3.fail(new SpaceNotFoundError(spaceId))));
|
|
341
341
|
var spaceIdWithDefault = (spaceId) => Effect3.gen(function* () {
|
|
342
342
|
const client = yield* ClientService2;
|
|
343
|
-
|
|
344
|
-
|
|
343
|
+
return Option2.getOrElse(spaceId, () => {
|
|
344
|
+
const personal = getPersonalSpace(client);
|
|
345
|
+
if (!personal) {
|
|
346
|
+
throw new Error("No space ID provided and no personal space found.");
|
|
347
|
+
}
|
|
348
|
+
return personal.id;
|
|
349
|
+
});
|
|
345
350
|
});
|
|
346
|
-
var spaceLayer = (spaceId$,
|
|
351
|
+
var spaceLayer = (spaceId$, fallbackToPersonalSpace = false) => {
|
|
347
352
|
const getSpace2 = Effect3.fn(function* () {
|
|
348
353
|
const client = yield* ClientService2;
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
354
|
+
const resolveSpace = () => {
|
|
355
|
+
if (!fallbackToPersonalSpace) {
|
|
356
|
+
return spaceId$.pipe(Option2.flatMap((id) => Option2.fromNullable(client.spaces.get(id))));
|
|
357
|
+
}
|
|
358
|
+
return spaceId$.pipe(Option2.flatMap((id) => Option2.fromNullable(client.spaces.get(id))), Option2.orElse(() => Option2.fromNullable(getPersonalSpace(client))), Option2.orElse(() => Option2.fromNullable(client.spaces.get()[0])));
|
|
359
|
+
};
|
|
360
|
+
const space = resolveSpace().pipe(Option2.getOrUndefined);
|
|
352
361
|
if (space) {
|
|
353
362
|
yield* Effect3.promise(() => space.waitUntilReady());
|
|
354
363
|
}
|
|
355
364
|
return space;
|
|
356
365
|
});
|
|
366
|
+
const NO_DB_STUB = {
|
|
367
|
+
get db() {
|
|
368
|
+
throw new Error("Space not found");
|
|
369
|
+
}
|
|
370
|
+
};
|
|
357
371
|
const db = Layer.scoped(Database.Service, Effect3.acquireRelease(Effect3.gen(function* () {
|
|
358
372
|
const space = yield* getSpace2();
|
|
359
373
|
if (!space) {
|
|
360
|
-
return
|
|
361
|
-
get db() {
|
|
362
|
-
throw new Error("Space not found");
|
|
363
|
-
}
|
|
364
|
-
};
|
|
374
|
+
return NO_DB_STUB;
|
|
365
375
|
}
|
|
366
376
|
return {
|
|
367
377
|
db: space.db
|
|
368
378
|
};
|
|
369
|
-
}), (
|
|
379
|
+
}), (holder) => holder === NO_DB_STUB ? Effect3.void : Effect3.promise(() => holder.db.flush())));
|
|
370
380
|
const queue = Layer.effect(QueueService, Effect3.gen(function* () {
|
|
371
381
|
const space = yield* getSpace2();
|
|
372
382
|
if (!space) {
|
|
@@ -400,12 +410,7 @@ var waitForSync = Effect3.fn(function* (space) {
|
|
|
400
410
|
yield* Effect3.promise(() => space.internal.syncToEdge({
|
|
401
411
|
onProgress: (state) => log2.info("syncing", {
|
|
402
412
|
state: state ?? "no connection to edge"
|
|
403
|
-
}, {
|
|
404
|
-
F: __dxlog_file,
|
|
405
|
-
L: 125,
|
|
406
|
-
S: this,
|
|
407
|
-
C: (f, a) => f(...a)
|
|
408
|
-
})
|
|
413
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 107, S: this })
|
|
409
414
|
}));
|
|
410
415
|
yield* Console.log("Sync complete");
|
|
411
416
|
});
|
|
@@ -427,28 +432,61 @@ var SpaceNotFoundError = class extends BaseError.extend("SpaceNotFoundError", "S
|
|
|
427
432
|
};
|
|
428
433
|
|
|
429
434
|
// src/util/space-format.ts
|
|
435
|
+
import * as Duration from "effect/Duration";
|
|
430
436
|
import * as Effect4 from "effect/Effect";
|
|
431
437
|
import { SpaceState } from "@dxos/client/echo";
|
|
432
|
-
var
|
|
438
|
+
var DEFAULT_OPTIONS = {
|
|
433
439
|
verbose: false,
|
|
434
|
-
truncateKeys: false
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
+
truncateKeys: false,
|
|
441
|
+
waitSeconds: 0
|
|
442
|
+
};
|
|
443
|
+
var READ_TIMEOUT_SECONDS = 2;
|
|
444
|
+
var tryWithFallback = (label, run, fallback) => Effect4.tryPromise(run).pipe(Effect4.timeoutFail({
|
|
445
|
+
duration: Duration.seconds(READ_TIMEOUT_SECONDS),
|
|
446
|
+
onTimeout: () => new Error(`${label} timed out`)
|
|
447
|
+
}), Effect4.catchAll(() => Effect4.succeed(fallback)));
|
|
448
|
+
var tryWithFallbackSync = (read, fallback) => {
|
|
449
|
+
try {
|
|
450
|
+
return read();
|
|
451
|
+
} catch {
|
|
452
|
+
return fallback;
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
var formatSpace = Effect4.fn(function* (space, options = {}) {
|
|
456
|
+
const { waitSeconds } = {
|
|
457
|
+
...DEFAULT_OPTIONS,
|
|
458
|
+
...options
|
|
459
|
+
};
|
|
460
|
+
if (waitSeconds > 0) {
|
|
461
|
+
yield* Effect4.tryPromise(() => space.waitUntilReady()).pipe(Effect4.timeoutFail({
|
|
462
|
+
duration: Duration.seconds(waitSeconds),
|
|
463
|
+
onTimeout: () => new Error("waitUntilReady timed out")
|
|
464
|
+
}), Effect4.catchAll(() => Effect4.void));
|
|
465
|
+
}
|
|
466
|
+
const state = tryWithFallbackSync(() => space.state.get(), SpaceState.SPACE_INITIALIZING);
|
|
467
|
+
const ready = state === SpaceState.SPACE_READY;
|
|
468
|
+
const metrics = tryWithFallbackSync(() => space.internal.data.metrics, void 0);
|
|
469
|
+
const startup = metrics?.open && metrics?.ready ? metrics.ready.getTime() - metrics.open.getTime() : void 0;
|
|
470
|
+
const pipeline = tryWithFallbackSync(() => space.internal.data.pipeline, void 0);
|
|
440
471
|
const epoch = pipeline?.currentEpoch?.subject.assertion.number;
|
|
441
|
-
const
|
|
472
|
+
const syncStateRaw = yield* tryWithFallback("getSyncState", () => space.internal.db.coreDatabase.getSyncState(), {
|
|
473
|
+
peers: {}
|
|
474
|
+
});
|
|
475
|
+
const syncState = aggregateSyncState(syncStateRaw);
|
|
476
|
+
const name = ready ? tryWithFallbackSync(() => space.properties.name, void 0) : "loading...";
|
|
477
|
+
const members = tryWithFallbackSync(() => space.members.get().length, 0);
|
|
478
|
+
const objects = tryWithFallbackSync(() => space.internal.db.coreDatabase.getAllObjectIds().length, 0);
|
|
479
|
+
const key = options.truncateKeys ? tryWithFallbackSync(() => space.key.truncate(), "") : tryWithFallbackSync(() => space.key.toHex(), "");
|
|
442
480
|
return {
|
|
443
481
|
id: space.id,
|
|
444
|
-
state: SpaceState[
|
|
445
|
-
name
|
|
446
|
-
members
|
|
447
|
-
objects
|
|
448
|
-
key
|
|
482
|
+
state: SpaceState[state],
|
|
483
|
+
name,
|
|
484
|
+
members,
|
|
485
|
+
objects,
|
|
486
|
+
key,
|
|
449
487
|
epoch,
|
|
450
488
|
startup,
|
|
451
|
-
automergeRoot:
|
|
489
|
+
automergeRoot: pipeline?.spaceRootUrl,
|
|
452
490
|
// appliedEpoch,
|
|
453
491
|
syncState: `${syncState.count} ${getSyncIndicator(syncState.up, syncState.down)} (${syncState.peers} peers)`
|
|
454
492
|
};
|
|
@@ -486,12 +524,12 @@ var printSpace = (spaceData) => make({
|
|
|
486
524
|
|
|
487
525
|
// src/util/timeout.ts
|
|
488
526
|
import * as Config from "effect/Config";
|
|
489
|
-
import * as
|
|
527
|
+
import * as Duration2 from "effect/Duration";
|
|
490
528
|
import * as Effect5 from "effect/Effect";
|
|
491
529
|
import * as Option3 from "effect/Option";
|
|
492
530
|
var withTimeout = Effect5.fnUntraced(function* (effect2) {
|
|
493
531
|
const timeout2 = yield* Config.integer("TIMEOUT").pipe(Config.option);
|
|
494
|
-
const duration = timeout2.pipe(Option3.map(
|
|
532
|
+
const duration = timeout2.pipe(Option3.map(Duration2.millis), Option3.getOrElse(() => Duration2.infinity));
|
|
495
533
|
return yield* effect2.pipe(Effect5.timeout(duration));
|
|
496
534
|
});
|
|
497
535
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/util/form-builder.ts", "../../../src/util/options.ts", "../../../src/util/platform.ts", "../../../src/util/printer.ts", "../../../src/util/runtime.ts", "../../../src/util/space.ts", "../../../src/util/space-format.ts", "../../../src/util/timeout.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Doc from '@effect/printer/Doc';\nimport * as Ansi from '@effect/printer-ansi/Ansi';\nimport * as Option from 'effect/Option';\nimport * as Pipeable from 'effect/Pipeable';\n\nexport type FormBuilderOptions = {\n title?: string;\n prefix?: string;\n};\n\nexport interface FormBuilder extends Pipeable.Pipeable {\n readonly entries: ReadonlyArray<{ key: string; value: Doc.Doc<any>; isNested?: boolean }>;\n readonly title?: string;\n readonly prefix: string;\n}\n\nclass FormBuilderImpl implements FormBuilder {\n readonly entries: Array<{ key: string; value: Doc.Doc<any>; isNested?: boolean }> = [];\n readonly title?: string;\n readonly prefix: string;\n\n constructor(options: FormBuilderOptions = {}) {\n this.title = options.title;\n this.prefix = options.prefix ?? '- ';\n }\n\n pipe() {\n // eslint-disable-next-line prefer-rest-params\n return Pipeable.pipeArguments(this, arguments);\n }\n}\n\n/**\n * Creates a new FormBuilder instance.\n */\nexport const make = (props?: FormBuilderOptions): FormBuilder => new FormBuilderImpl(props);\n\n// Helper to calculate dimensions for formatting\nconst calculateDimensions = (entries: ReadonlyArray<{ key: string }>, prefix: string) => {\n const maxKeyLen = Math.max(0, ...entries.map((entry) => entry.key.length));\n const targetWidth = prefix.length + maxKeyLen + 2;\n return { maxKeyLen, targetWidth };\n};\n\n// Helper to build a formatted key line\nconst buildKeyLine = (prefix: string, key: string, targetWidth: number) => {\n // Use fill to pad the key to targetWidth.\n // Note: We don't add indentation here; indentation is handled by the parent container or nestImpl.\n return Doc.annotate(Doc.fill(targetWidth)(Doc.text(prefix + key + ': ')), Ansi.blackBright);\n};\n\n// Implementation helper\nconst setImpl = <T>(\n builder: FormBuilder,\n key: string,\n value: T,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder => {\n if (value !== undefined) {\n let valueDoc: Doc.Doc<any>;\n if (typeof value === 'object' && value !== null) {\n // Assume it's a Doc.Doc\n valueDoc = value as unknown as Doc.Doc<any>;\n } else {\n valueDoc = Doc.text(String(value));\n }\n\n if (color) {\n const ansi = typeof color === 'function' ? color(value as T) : color;\n valueDoc = Doc.annotate(valueDoc, ansi);\n }\n\n (builder as FormBuilderImpl).entries.push({\n key,\n value: valueDoc,\n isNested: false,\n });\n }\n return builder;\n};\n\n/**\n * Adds a key-value pair to the form.\n */\nexport function set<T>(\n builder: FormBuilder,\n key: string,\n value: T,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder;\nexport function set<T>(\n key: string,\n value: T,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): (builder: FormBuilder) => FormBuilder;\nexport function set<T>(\n builderOrKey: FormBuilder | string,\n keyOrValue?: string | T,\n valueOrColor?: T | Ansi.Ansi | ((value: T) => Ansi.Ansi),\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrKey instanceof FormBuilderImpl) {\n // Direct: set(builder, key, value, color?)\n const builder = builderOrKey;\n const key = keyOrValue as string;\n const value = valueOrColor as T;\n return setImpl(builder, key, value, color);\n } else {\n // Curried: set(key, value, color?)\n const key = builderOrKey as string;\n const value = keyOrValue as T;\n const color = valueOrColor as Ansi.Ansi | ((value: T) => Ansi.Ansi) | undefined;\n return (builder: FormBuilder) => setImpl(builder, key, value, color);\n }\n}\n\n// Implementation helper\nconst nestImpl = (parent: FormBuilder, key: string, builder: FormBuilder): FormBuilder => {\n // Build nested entries without title, directly under the parent field name\n\n // Create a temporary builder without title to ignore it.\n const nestedBuilder: FormBuilder = {\n ...builder,\n title: undefined,\n entries: builder.entries,\n };\n\n // Build content.\n let valueDoc = build(nestedBuilder);\n\n // Indent the content by 2 spaces.\n // This ensures that when this doc is embedded in the parent, it is visually nested.\n valueDoc = Doc.indent(valueDoc, 2);\n\n (parent.entries as Array<{ key: string; value: Doc.Doc<any>; isNested?: boolean }>).push({\n key,\n value: valueDoc,\n isNested: true,\n });\n return parent;\n};\n\n/**\n * Nests another form builder under a key.\n */\nexport function nest(parent: FormBuilder, key: string, builder: FormBuilder): FormBuilder;\nexport function nest(key: string, builder: FormBuilder): (parent: FormBuilder) => FormBuilder;\nexport function nest(\n parentOrKey: FormBuilder | string,\n keyOrBuilder?: string | FormBuilder,\n builder?: FormBuilder,\n): FormBuilder | ((parent: FormBuilder) => FormBuilder) {\n if (parentOrKey instanceof FormBuilderImpl) {\n // Direct: nest(parent, key, builder)\n const parent = parentOrKey;\n const key = keyOrBuilder as string;\n return nestImpl(parent, key, builder!);\n } else {\n // Curried: nest(key, builder)\n const key = parentOrKey as string;\n const builder = keyOrBuilder as FormBuilder;\n return (parent: FormBuilder) => nestImpl(parent, key, builder);\n }\n}\n\n// Implementation helper\nconst optionImpl = <T>(\n builder: FormBuilder,\n key: string,\n value: Option.Option<T>,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder => {\n if (Option.isSome(value)) {\n return setImpl(builder, key, value.value, color);\n }\n return builder;\n};\n\n/**\n * Adds an optional value if it exists.\n */\nexport function option<T>(\n builder: FormBuilder,\n key: string,\n value: Option.Option<T>,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder;\nexport function option<T>(\n key: string,\n value: Option.Option<T>,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): (builder: FormBuilder) => FormBuilder;\nexport function option<T>(\n builderOrKey: FormBuilder | string,\n keyOrValue?: string | Option.Option<T>,\n valueOrColor?: Option.Option<T> | Ansi.Ansi | ((value: T) => Ansi.Ansi),\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrKey instanceof FormBuilderImpl) {\n // Direct: option(builder, key, value, color?)\n const builder = builderOrKey;\n const key = keyOrValue as string;\n const value = valueOrColor as Option.Option<T>;\n return optionImpl(builder, key, value, color);\n } else {\n // Curried: option(key, value, color?)\n const key = builderOrKey as string;\n const value = keyOrValue as Option.Option<T>;\n const color = valueOrColor as Ansi.Ansi | ((value: T) => Ansi.Ansi) | undefined;\n return (builder: FormBuilder) => optionImpl(builder, key, value, color);\n }\n}\n\n// Implementation helper\nconst nestedOptionImpl = (builder: FormBuilder, key: string, value: Option.Option<FormBuilder>): FormBuilder => {\n if (Option.isSome(value)) {\n return nestImpl(builder, key, value.value);\n }\n return builder;\n};\n\n/**\n * Nests an optional form builder if it exists.\n */\nexport function nestedOption(builder: FormBuilder, key: string, value: Option.Option<FormBuilder>): FormBuilder;\nexport function nestedOption(key: string, value: Option.Option<FormBuilder>): (builder: FormBuilder) => FormBuilder;\nexport function nestedOption(\n builderOrKey: FormBuilder | string,\n keyOrValue?: string | Option.Option<FormBuilder>,\n value?: Option.Option<FormBuilder>,\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrKey instanceof FormBuilderImpl) {\n // Direct: nestedOption(builder, key, value)\n const builder = builderOrKey;\n const key = keyOrValue as string;\n return nestedOptionImpl(builder, key, value!);\n } else {\n // Curried: nestedOption(key, value)\n const key = builderOrKey as string;\n const value = keyOrValue as Option.Option<FormBuilder>;\n return (builder: FormBuilder) => nestedOptionImpl(builder, key, value);\n }\n}\n\n// Implementation helper\nconst whenImpl = (builder: FormBuilder, condition: any, ...ops: ((b: FormBuilder) => FormBuilder)[]): FormBuilder => {\n if (condition) {\n for (const op of ops) {\n op(builder);\n }\n }\n return builder;\n};\n\n/**\n * Conditionally executes operations.\n */\nexport function when(builder: FormBuilder, condition: any, ...ops: ((b: FormBuilder) => FormBuilder)[]): FormBuilder;\nexport function when(\n condition: any,\n ...ops: ((b: FormBuilder) => FormBuilder)[]\n): (builder: FormBuilder) => FormBuilder;\nexport function when(\n builderOrCondition: FormBuilder | any,\n conditionOrOp?: any | ((b: FormBuilder) => FormBuilder),\n ...ops: ((b: FormBuilder) => FormBuilder)[]\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrCondition instanceof FormBuilderImpl) {\n // Direct: when(builder, condition, ...ops)\n const builder = builderOrCondition;\n const condition = conditionOrOp;\n return whenImpl(builder, condition, ...ops);\n } else {\n // Curried: when(condition, ...ops)\n const condition = builderOrCondition;\n const allOps = [conditionOrOp, ...ops].filter(\n (op): op is (b: FormBuilder) => FormBuilder => typeof op === 'function',\n );\n return (builder: FormBuilder) => whenImpl(builder, condition, ...allOps);\n }\n}\n\n// Implementation helper\nconst eachImpl = <T>(\n builder: FormBuilder,\n items: T[],\n fn: (item: T) => (b: FormBuilder) => FormBuilder,\n): FormBuilder => {\n items.forEach((item) => fn(item)(builder));\n return builder;\n};\n\n/**\n * Iterates over an array of items.\n */\nexport function each<T>(\n builder: FormBuilder,\n items: T[],\n fn: (item: T) => (b: FormBuilder) => FormBuilder,\n): FormBuilder;\nexport function each<T>(\n items: T[],\n fn: (item: T) => (b: FormBuilder) => FormBuilder,\n): (builder: FormBuilder) => FormBuilder;\nexport function each<T>(\n builderOrItems: FormBuilder | T[],\n itemsOrFn?: T[] | ((item: T) => (b: FormBuilder) => FormBuilder),\n fn?: (item: T) => (b: FormBuilder) => FormBuilder,\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrItems instanceof FormBuilderImpl) {\n // Direct: each(builder, items, fn)\n const builder = builderOrItems;\n const items = itemsOrFn as T[];\n return eachImpl(builder, items, fn!);\n } else {\n // Curried: each(items, fn)\n const items = builderOrItems as T[];\n const fn = itemsOrFn as (item: T) => (b: FormBuilder) => FormBuilder;\n return (builder: FormBuilder) => eachImpl(builder, items, fn);\n }\n}\n\n/**\n * Builds the final document.\n */\nexport const build = (builder: FormBuilder): Doc.Doc<any> => {\n const { targetWidth } = calculateDimensions(builder.entries, builder.prefix);\n const entryLines: Doc.Doc<any>[] = [];\n\n builder.entries.forEach(({ key, value, isNested }) => {\n const keyLine = buildKeyLine(builder.prefix, key, targetWidth);\n if (isNested) {\n // Nested content should start on a new line.\n // value is already indented by nestImpl, so we just cat with hardLine.\n entryLines.push(Doc.hcat([keyLine, Doc.hardLine, value]));\n } else {\n // Single-line value, combine key and value.\n // If the value itself is multiline (e.g. from Doc.string with newlines, though Doc handles that specifically),\n // we might want layout flexibility.\n // For now, standard behavior:\n entryLines.push(Doc.hcat([keyLine, value]));\n }\n });\n\n const entriesDoc = Doc.vsep(entryLines);\n\n if (builder.title) {\n const titleDoc = Doc.hcat([Doc.annotate(Doc.text(builder.title), Ansi.combine(Ansi.bold, Ansi.cyan))]);\n // Join title and entries with a single line break, no extra spacing\n return Doc.cat(titleDoc, Doc.cat(Doc.line, entriesDoc));\n }\n\n return entriesDoc;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Options from '@effect/cli/Options';\n\nimport { Key } from '@dxos/echo';\n\n//\n// Common options.\n// NOTE: Sub-commands should Function.pipe(Options.optional) if required.\n//\n\nexport const Common = {\n functionId: Options.text('function-id').pipe(Options.withDescription('EDGE Function ID.')),\n spaceId: Options.text('space-id').pipe(Options.withSchema(Key.SpaceId), Options.withDescription('Space ID.')),\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { spawn } from 'node:child_process';\n\nimport * as Effect from 'effect/Effect';\n\n/**\n * Copy text to the system clipboard.\n * Supports macOS (pbcopy), Windows (clip), and Linux (xclip/xsel).\n */\nexport const copyToClipboard = (text: string): Effect.Effect<void, Error> =>\n Effect.tryPromise({\n try: () => {\n return new Promise<void>((resolve, reject) => {\n const platform = process.platform;\n let command: string;\n let args: string[];\n\n if (platform === 'darwin') {\n command = 'pbcopy';\n args = [];\n } else if (platform === 'win32') {\n command = 'clip';\n args = [];\n } else {\n // Linux - try xclip or xsel\n command = 'xclip';\n args = ['-selection', 'clipboard'];\n }\n\n const proc = spawn(command, args);\n proc.stdin?.write(text);\n proc.stdin?.end();\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n // Try xsel as fallback on Linux\n if (platform === 'linux') {\n const proc2 = spawn('xsel', ['--clipboard', '--input']);\n proc2.stdin?.write(text);\n proc2.stdin?.end();\n proc2.on('close', (code2) => {\n if (code2 === 0) {\n resolve();\n } else {\n reject(new Error('Failed to copy to clipboard'));\n }\n });\n proc2.on('error', reject);\n } else {\n reject(new Error('Failed to copy to clipboard'));\n }\n }\n });\n\n proc.on('error', reject);\n });\n },\n catch: (error) => new Error(`Failed to copy to clipboard: ${error}`),\n });\n\n/**\n * Open a URL in the system's default browser.\n * Supports macOS (open), Windows (start), and Linux (xdg-open).\n */\nexport const openBrowser = (url: string): Effect.Effect<void, Error> =>\n Effect.tryPromise({\n try: () => {\n return new Promise<void>((resolve, reject) => {\n const platform = process.platform;\n let command: string;\n let args: string[];\n\n if (platform === 'darwin') {\n command = 'open';\n args = [url];\n } else if (platform === 'win32') {\n command = 'start';\n args = [url];\n } else {\n command = 'xdg-open';\n args = [url];\n }\n\n const proc = spawn(command, args);\n proc.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error('Failed to open browser'));\n }\n });\n proc.on('error', reject);\n });\n },\n catch: (error) => new Error(`Failed to open browser: ${error}`),\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Doc from '@effect/printer/Doc';\nimport * as AnsiDoc from '@effect/printer-ansi/AnsiDoc';\n\n/**\n * Pretty print document.\n */\nexport const print = (doc: Doc.Doc<any>) => AnsiDoc.render(doc, { style: 'pretty' });\n\n/**\n * Pretty prints a list of documents with ANSI colors.\n */\nexport const printList = (items: Array<Doc.Doc<any>>) =>\n AnsiDoc.render(Doc.vsep(items.map((item) => Doc.cat(item, Doc.hardLine))), { style: 'pretty' });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { ClientService } from '@dxos/client';\nimport { type Type } from '@dxos/echo';\n\n/** @deprecated Migrate to providing types via plugin capabilities. */\nexport const withTypes: (...types: Type.AnyEntity[]) => Effect.Effect<void, never, ClientService> = (...types) =>\n Effect.gen(function* () {\n const client = yield* ClientService;\n yield* Effect.promise(() => client.addTypes(types));\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Match from 'effect/Match';\nimport * as Option from 'effect/Option';\n\nimport { ClientService } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { Database, type Key } from '@dxos/echo';\nimport { BaseError, type BaseErrorOptions } from '@dxos/errors';\nimport { QueueService } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { isBun } from '@dxos/util';\n\nexport const getSpace = (spaceId: Key.SpaceId): Effect.Effect<Space, SpaceNotFoundError, ClientService> =>\n Effect.gen(function* () {\n const client = yield* ClientService;\n return yield* Option.fromNullable(client.spaces.get(spaceId));\n }).pipe(Effect.catchTag('NoSuchElementException', () => Effect.fail(new SpaceNotFoundError(spaceId))));\n\nexport const spaceIdWithDefault = (spaceId: Option.Option<Key.SpaceId>) =>\n Effect.gen(function* () {\n const client = yield* ClientService;\n yield* Effect.promise(() => client.spaces.waitUntilReady());\n return Option.getOrElse(spaceId, () => client.spaces.default.id);\n });\n\n// TODO(wittjosiah): Factor out.\nexport const spaceLayer = (\n spaceId$: Option.Option<Key.SpaceId>,\n fallbackToDefaultSpace = false,\n): Layer.Layer<Database.Service | QueueService, never, ClientService> => {\n const getSpace = Effect.fn(function* () {\n const client = yield* ClientService;\n yield* Effect.promise(() => client.spaces.waitUntilReady());\n\n const spaceId = Match.value(fallbackToDefaultSpace).pipe(\n Match.when(true, () =>\n spaceId$.pipe(\n Option.getOrElse(() => client.spaces.default.id),\n Option.some,\n ),\n ),\n Match.when(false, () => spaceId$),\n Match.exhaustive,\n );\n\n const space = spaceId.pipe(\n Option.flatMap((id) => Option.fromNullable(client.spaces.get(id))),\n Option.getOrUndefined,\n );\n\n if (space) {\n yield* Effect.promise(() => space.waitUntilReady());\n }\n return space;\n });\n\n const db = Layer.scoped(\n Database.Service,\n Effect.acquireRelease(\n Effect.gen(function* () {\n const space = yield* getSpace();\n if (!space) {\n return {\n get db(): Database.Database {\n throw new Error('Space not found');\n },\n };\n }\n return { db: space.db };\n }),\n ({ db }) => Effect.promise(() => db.flush()),\n ),\n );\n\n const queue = Layer.effect(\n QueueService,\n Effect.gen(function* () {\n const space = yield* getSpace();\n if (!space) {\n return {\n queues: {\n get: (_dxn) => {\n throw new Error('Queues not available');\n },\n create: () => {\n throw new Error('Queues not available');\n },\n },\n queue: undefined,\n };\n }\n return {\n queues: space.queues,\n queue: undefined,\n };\n }),\n );\n\n return Layer.merge(db, queue);\n};\n\n// TODO(dmaretskyi): There a race condition with edge connection not showing up.\nexport const waitForSync = Effect.fn(function* (space: Space) {\n // TODO(wittjosiah): Find a better way to do this.\n if (!isBun()) {\n // Skipping sync to edge when not in bun env as this indicates running a test.\n return;\n }\n\n // TODO(wittjosiah): This should probably be prompted for.\n if (space.internal.data.edgeReplication !== EdgeReplicationSetting.ENABLED) {\n yield* Console.log('Edge replication is disabled, enabling...');\n yield* Effect.promise(() => space.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED));\n }\n\n yield* Effect.promise(() =>\n space.internal.syncToEdge({\n onProgress: (state) => log.info('syncing', { state: state ?? 'no connection to edge' }),\n }),\n );\n yield* Console.log('Sync complete');\n});\n\nexport const flushAndSync = Effect.fn(function* (opts?: Database.FlushOptions) {\n yield* Database.flush(opts);\n const spaceId = yield* Database.spaceId;\n const space = yield* getSpace(spaceId);\n yield* waitForSync(space);\n});\n\n// TODO(burdon): Reconcile with @dxos/protocols\nexport class SpaceNotFoundError extends BaseError.extend('SpaceNotFoundError', 'Space not found') {\n constructor(spaceId: string, options?: Omit<BaseErrorOptions, 'context'>) {\n super({ context: { spaceId }, ...options });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { type Space, SpaceState, type SpaceSyncState } from '@dxos/client/echo';\n\nimport * as FormBuilder from './form-builder';\n\n// TODO(wittjosiah): Use @effect/printer.\nexport const formatSpace = Effect.fn(function* (space: Space, options = { verbose: false, truncateKeys: false }) {\n yield* Effect.tryPromise(() => space.waitUntilReady());\n\n // TODO(burdon): Factor out.\n // TODO(burdon): Agent needs to restart before `ready` is available.\n const { open, ready } = space.internal.data.metrics ?? {};\n const startup = open && ready && ready.getTime() - open.getTime();\n\n // TODO(burdon): Get feeds from client-services if verbose (factor out from devtools/diagnostics).\n // const host = client.services.services.DevtoolsHost!;\n const pipeline = space.internal.data.pipeline;\n const epoch = pipeline?.currentEpoch?.subject.assertion.number;\n\n const syncState = aggregateSyncState(yield* Effect.tryPromise(() => space.internal.db.coreDatabase.getSyncState()));\n\n return {\n id: space.id,\n state: SpaceState[space.state.get()],\n name: space.state.get() === SpaceState.SPACE_READY ? space.properties.name : 'loading...',\n\n members: space.members.get().length,\n objects: space.internal.db.coreDatabase.getAllObjectIds().length,\n\n key: options.truncateKeys ? space.key.truncate() : space.key.toHex(),\n epoch,\n startup,\n automergeRoot: space.internal.data.pipeline?.spaceRootUrl,\n // appliedEpoch,\n syncState: `${syncState.count} ${getSyncIndicator(syncState.up, syncState.down)} (${syncState.peers} peers)`,\n };\n});\n\nconst aggregateSyncState = (syncState: SpaceSyncState) => {\n const peers = Object.keys(syncState.peers ?? {}).length;\n const missingOnLocal = Math.max(...Object.values(syncState.peers ?? {}).map((peer) => peer.missingOnLocal), 0);\n const missingOnRemote = Math.max(...Object.values(syncState.peers ?? {}).map((peer) => peer.missingOnRemote), 0);\n const differentDocuments = Math.max(\n ...Object.values(syncState.peers ?? {}).map((peer) => peer.differentDocuments),\n 0,\n );\n\n return {\n count: missingOnLocal + missingOnRemote + differentDocuments,\n peers,\n up: missingOnRemote > 0 || differentDocuments > 0,\n down: missingOnLocal > 0 || differentDocuments > 0,\n };\n};\n\nconst getSyncIndicator = (up: boolean, down: boolean) => {\n if (up) {\n if (down) {\n return '⇅';\n } else {\n return '↑';\n }\n } else {\n if (down) {\n return '↓';\n } else {\n return '✓';\n }\n }\n};\n\nexport type FormattedSpace = {\n id: string;\n state: string;\n name: string | undefined;\n members: number;\n objects: number;\n key: string;\n epoch: any;\n startup: number | undefined;\n automergeRoot: string | undefined;\n syncState: string;\n};\n\n/**\n * Pretty prints a space with ANSI colors.\n */\nexport const printSpace = (spaceData: FormattedSpace) =>\n FormBuilder.make({ title: spaceData.name ?? spaceData.id }).pipe(\n FormBuilder.set('id', spaceData.id),\n FormBuilder.set('state', spaceData.state),\n FormBuilder.set('key', spaceData.key),\n FormBuilder.set('members', spaceData.members),\n FormBuilder.set('objects', spaceData.objects),\n FormBuilder.set('epoch', spaceData.epoch ?? '<none>'),\n FormBuilder.set('startup', spaceData.startup ? `${spaceData.startup}ms` : '<none>'),\n FormBuilder.set('syncState', spaceData.syncState),\n FormBuilder.set('automergeRoot', spaceData.automergeRoot ?? '<none>'),\n FormBuilder.build,\n );\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Cause from 'effect/Cause';\nimport * as Config from 'effect/Config';\nimport type * as ConfigError from 'effect/ConfigError';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nexport const withTimeout: <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n) => Effect.Effect<A, Cause.TimeoutException | ConfigError.ConfigError | E, R> = Effect.fnUntraced(function* (effect) {\n const timeout = yield* Config.integer('TIMEOUT').pipe(Config.option);\n const duration = timeout.pipe(\n Option.map(Duration.millis),\n Option.getOrElse(() => Duration.infinity),\n );\n return yield* effect.pipe(Effect.timeout(duration));\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Ansi from '@effect/printer-ansi/Ansi';\nimport * as Doc from '@effect/printer/Doc';\nimport * as Option from 'effect/Option';\nimport * as Pipeable from 'effect/Pipeable';\n\nexport type FormBuilderOptions = {\n title?: string;\n prefix?: string;\n};\n\nexport interface FormBuilder extends Pipeable.Pipeable {\n readonly entries: ReadonlyArray<{ key: string; value: Doc.Doc<any>; isNested?: boolean }>;\n readonly title?: string;\n readonly prefix: string;\n}\n\nclass FormBuilderImpl implements FormBuilder {\n readonly entries: Array<{ key: string; value: Doc.Doc<any>; isNested?: boolean }> = [];\n readonly title?: string;\n readonly prefix: string;\n\n constructor(options: FormBuilderOptions = {}) {\n this.title = options.title;\n this.prefix = options.prefix ?? '- ';\n }\n\n pipe() {\n // eslint-disable-next-line prefer-rest-params\n return Pipeable.pipeArguments(this, arguments);\n }\n}\n\n/**\n * Creates a new FormBuilder instance.\n */\nexport const make = (props?: FormBuilderOptions): FormBuilder => new FormBuilderImpl(props);\n\n// Helper to calculate dimensions for formatting\nconst calculateDimensions = (entries: ReadonlyArray<{ key: string }>, prefix: string) => {\n const maxKeyLen = Math.max(0, ...entries.map((entry) => entry.key.length));\n const targetWidth = prefix.length + maxKeyLen + 2;\n return { maxKeyLen, targetWidth };\n};\n\n// Helper to build a formatted key line\nconst buildKeyLine = (prefix: string, key: string, targetWidth: number) => {\n // Use fill to pad the key to targetWidth.\n // Note: We don't add indentation here; indentation is handled by the parent container or nestImpl.\n return Doc.annotate(Doc.fill(targetWidth)(Doc.text(prefix + key + ': ')), Ansi.blackBright);\n};\n\n// Implementation helper\nconst setImpl = <T>(\n builder: FormBuilder,\n key: string,\n value: T,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder => {\n if (value !== undefined) {\n let valueDoc: Doc.Doc<any>;\n if (typeof value === 'object' && value !== null) {\n // Assume it's a Doc.Doc\n valueDoc = value as unknown as Doc.Doc<any>;\n } else {\n valueDoc = Doc.text(String(value));\n }\n\n if (color) {\n const ansi = typeof color === 'function' ? color(value as T) : color;\n valueDoc = Doc.annotate(valueDoc, ansi);\n }\n\n (builder as FormBuilderImpl).entries.push({\n key,\n value: valueDoc,\n isNested: false,\n });\n }\n return builder;\n};\n\n/**\n * Adds a key-value pair to the form.\n */\nexport function set<T>(\n builder: FormBuilder,\n key: string,\n value: T,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder;\nexport function set<T>(\n key: string,\n value: T,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): (builder: FormBuilder) => FormBuilder;\nexport function set<T>(\n builderOrKey: FormBuilder | string,\n keyOrValue?: string | T,\n valueOrColor?: T | Ansi.Ansi | ((value: T) => Ansi.Ansi),\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrKey instanceof FormBuilderImpl) {\n // Direct: set(builder, key, value, color?)\n const builder = builderOrKey;\n const key = keyOrValue as string;\n const value = valueOrColor as T;\n return setImpl(builder, key, value, color);\n } else {\n // Curried: set(key, value, color?)\n const key = builderOrKey as string;\n const value = keyOrValue as T;\n const color = valueOrColor as Ansi.Ansi | ((value: T) => Ansi.Ansi) | undefined;\n return (builder: FormBuilder) => setImpl(builder, key, value, color);\n }\n}\n\n// Implementation helper\nconst nestImpl = (parent: FormBuilder, key: string, builder: FormBuilder): FormBuilder => {\n // Build nested entries without title, directly under the parent field name\n\n // Create a temporary builder without title to ignore it.\n const nestedBuilder: FormBuilder = {\n ...builder,\n title: undefined,\n entries: builder.entries,\n };\n\n // Build content.\n let valueDoc = build(nestedBuilder);\n\n // Indent the content by 2 spaces.\n // This ensures that when this doc is embedded in the parent, it is visually nested.\n valueDoc = Doc.indent(valueDoc, 2);\n\n (parent.entries as Array<{ key: string; value: Doc.Doc<any>; isNested?: boolean }>).push({\n key,\n value: valueDoc,\n isNested: true,\n });\n return parent;\n};\n\n/**\n * Nests another form builder under a key.\n */\nexport function nest(parent: FormBuilder, key: string, builder: FormBuilder): FormBuilder;\nexport function nest(key: string, builder: FormBuilder): (parent: FormBuilder) => FormBuilder;\nexport function nest(\n parentOrKey: FormBuilder | string,\n keyOrBuilder?: string | FormBuilder,\n builder?: FormBuilder,\n): FormBuilder | ((parent: FormBuilder) => FormBuilder) {\n if (parentOrKey instanceof FormBuilderImpl) {\n // Direct: nest(parent, key, builder)\n const parent = parentOrKey;\n const key = keyOrBuilder as string;\n return nestImpl(parent, key, builder!);\n } else {\n // Curried: nest(key, builder)\n const key = parentOrKey as string;\n const builder = keyOrBuilder as FormBuilder;\n return (parent: FormBuilder) => nestImpl(parent, key, builder);\n }\n}\n\n// Implementation helper\nconst optionImpl = <T>(\n builder: FormBuilder,\n key: string,\n value: Option.Option<T>,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder => {\n if (Option.isSome(value)) {\n return setImpl(builder, key, value.value, color);\n }\n return builder;\n};\n\n/**\n * Adds an optional value if it exists.\n */\nexport function option<T>(\n builder: FormBuilder,\n key: string,\n value: Option.Option<T>,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder;\nexport function option<T>(\n key: string,\n value: Option.Option<T>,\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): (builder: FormBuilder) => FormBuilder;\nexport function option<T>(\n builderOrKey: FormBuilder | string,\n keyOrValue?: string | Option.Option<T>,\n valueOrColor?: Option.Option<T> | Ansi.Ansi | ((value: T) => Ansi.Ansi),\n color?: Ansi.Ansi | ((value: T) => Ansi.Ansi),\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrKey instanceof FormBuilderImpl) {\n // Direct: option(builder, key, value, color?)\n const builder = builderOrKey;\n const key = keyOrValue as string;\n const value = valueOrColor as Option.Option<T>;\n return optionImpl(builder, key, value, color);\n } else {\n // Curried: option(key, value, color?)\n const key = builderOrKey as string;\n const value = keyOrValue as Option.Option<T>;\n const color = valueOrColor as Ansi.Ansi | ((value: T) => Ansi.Ansi) | undefined;\n return (builder: FormBuilder) => optionImpl(builder, key, value, color);\n }\n}\n\n// Implementation helper\nconst nestedOptionImpl = (builder: FormBuilder, key: string, value: Option.Option<FormBuilder>): FormBuilder => {\n if (Option.isSome(value)) {\n return nestImpl(builder, key, value.value);\n }\n return builder;\n};\n\n/**\n * Nests an optional form builder if it exists.\n */\nexport function nestedOption(builder: FormBuilder, key: string, value: Option.Option<FormBuilder>): FormBuilder;\nexport function nestedOption(key: string, value: Option.Option<FormBuilder>): (builder: FormBuilder) => FormBuilder;\nexport function nestedOption(\n builderOrKey: FormBuilder | string,\n keyOrValue?: string | Option.Option<FormBuilder>,\n value?: Option.Option<FormBuilder>,\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrKey instanceof FormBuilderImpl) {\n // Direct: nestedOption(builder, key, value)\n const builder = builderOrKey;\n const key = keyOrValue as string;\n return nestedOptionImpl(builder, key, value!);\n } else {\n // Curried: nestedOption(key, value)\n const key = builderOrKey as string;\n const value = keyOrValue as Option.Option<FormBuilder>;\n return (builder: FormBuilder) => nestedOptionImpl(builder, key, value);\n }\n}\n\n// Implementation helper\nconst whenImpl = (builder: FormBuilder, condition: any, ...ops: ((b: FormBuilder) => FormBuilder)[]): FormBuilder => {\n if (condition) {\n for (const op of ops) {\n op(builder);\n }\n }\n return builder;\n};\n\n/**\n * Conditionally executes operations.\n */\nexport function when(builder: FormBuilder, condition: any, ...ops: ((b: FormBuilder) => FormBuilder)[]): FormBuilder;\nexport function when(\n condition: any,\n ...ops: ((b: FormBuilder) => FormBuilder)[]\n): (builder: FormBuilder) => FormBuilder;\nexport function when(\n builderOrCondition: FormBuilder | any,\n conditionOrOp?: any | ((b: FormBuilder) => FormBuilder),\n ...ops: ((b: FormBuilder) => FormBuilder)[]\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrCondition instanceof FormBuilderImpl) {\n // Direct: when(builder, condition, ...ops)\n const builder = builderOrCondition;\n const condition = conditionOrOp;\n return whenImpl(builder, condition, ...ops);\n } else {\n // Curried: when(condition, ...ops)\n const condition = builderOrCondition;\n const allOps = [conditionOrOp, ...ops].filter(\n (op): op is (b: FormBuilder) => FormBuilder => typeof op === 'function',\n );\n return (builder: FormBuilder) => whenImpl(builder, condition, ...allOps);\n }\n}\n\n// Implementation helper\nconst eachImpl = <T>(\n builder: FormBuilder,\n items: T[],\n fn: (item: T) => (b: FormBuilder) => FormBuilder,\n): FormBuilder => {\n items.forEach((item) => fn(item)(builder));\n return builder;\n};\n\n/**\n * Iterates over an array of items.\n */\nexport function each<T>(\n builder: FormBuilder,\n items: T[],\n fn: (item: T) => (b: FormBuilder) => FormBuilder,\n): FormBuilder;\nexport function each<T>(\n items: T[],\n fn: (item: T) => (b: FormBuilder) => FormBuilder,\n): (builder: FormBuilder) => FormBuilder;\nexport function each<T>(\n builderOrItems: FormBuilder | T[],\n itemsOrFn?: T[] | ((item: T) => (b: FormBuilder) => FormBuilder),\n fn?: (item: T) => (b: FormBuilder) => FormBuilder,\n): FormBuilder | ((builder: FormBuilder) => FormBuilder) {\n if (builderOrItems instanceof FormBuilderImpl) {\n // Direct: each(builder, items, fn)\n const builder = builderOrItems;\n const items = itemsOrFn as T[];\n return eachImpl(builder, items, fn!);\n } else {\n // Curried: each(items, fn)\n const items = builderOrItems as T[];\n const fn = itemsOrFn as (item: T) => (b: FormBuilder) => FormBuilder;\n return (builder: FormBuilder) => eachImpl(builder, items, fn);\n }\n}\n\n/**\n * Builds the final document.\n */\nexport const build = (builder: FormBuilder): Doc.Doc<any> => {\n const { targetWidth } = calculateDimensions(builder.entries, builder.prefix);\n const entryLines: Doc.Doc<any>[] = [];\n\n builder.entries.forEach(({ key, value, isNested }) => {\n const keyLine = buildKeyLine(builder.prefix, key, targetWidth);\n if (isNested) {\n // Nested content should start on a new line.\n // value is already indented by nestImpl, so we just cat with hardLine.\n entryLines.push(Doc.hcat([keyLine, Doc.hardLine, value]));\n } else {\n // Single-line value, combine key and value.\n // If the value itself is multiline (e.g. from Doc.string with newlines, though Doc handles that specifically),\n // we might want layout flexibility.\n // For now, standard behavior:\n entryLines.push(Doc.hcat([keyLine, value]));\n }\n });\n\n const entriesDoc = Doc.vsep(entryLines);\n\n if (builder.title) {\n const titleDoc = Doc.hcat([Doc.annotate(Doc.text(builder.title), Ansi.combine(Ansi.bold, Ansi.cyan))]);\n // Join title and entries with a single line break, no extra spacing\n return Doc.cat(titleDoc, Doc.cat(Doc.line, entriesDoc));\n }\n\n return entriesDoc;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Options from '@effect/cli/Options';\n\nimport { Key } from '@dxos/echo';\n\n//\n// Common options.\n// NOTE: Sub-commands should Function.pipe(Options.optional) if required.\n//\n\nexport const Common = {\n functionId: Options.text('function-id').pipe(Options.withDescription('EDGE Function ID.')),\n spaceId: Options.text('space-id').pipe(Options.withSchema(Key.SpaceId), Options.withDescription('Space ID.')),\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport { spawn } from 'node:child_process';\n\n/**\n * Copy text to the system clipboard.\n * Supports macOS (pbcopy), Windows (clip), and Linux (xclip/xsel).\n */\nexport const copyToClipboard = (text: string): Effect.Effect<void, Error> =>\n Effect.tryPromise({\n try: () => {\n return new Promise<void>((resolve, reject) => {\n const platform = process.platform;\n let command: string;\n let args: string[];\n\n if (platform === 'darwin') {\n command = 'pbcopy';\n args = [];\n } else if (platform === 'win32') {\n command = 'clip';\n args = [];\n } else {\n // Linux - try xclip or xsel\n command = 'xclip';\n args = ['-selection', 'clipboard'];\n }\n\n const proc = spawn(command, args);\n proc.stdin?.write(text);\n proc.stdin?.end();\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n // Try xsel as fallback on Linux\n if (platform === 'linux') {\n const proc2 = spawn('xsel', ['--clipboard', '--input']);\n proc2.stdin?.write(text);\n proc2.stdin?.end();\n proc2.on('close', (code2) => {\n if (code2 === 0) {\n resolve();\n } else {\n reject(new Error('Failed to copy to clipboard'));\n }\n });\n proc2.on('error', reject);\n } else {\n reject(new Error('Failed to copy to clipboard'));\n }\n }\n });\n\n proc.on('error', reject);\n });\n },\n catch: (error) => new Error(`Failed to copy to clipboard: ${error}`),\n });\n\n/**\n * Open a URL in the system's default browser.\n * Supports macOS (open), Windows (start), and Linux (xdg-open).\n */\nexport const openBrowser = (url: string): Effect.Effect<void, Error> =>\n Effect.tryPromise({\n try: () => {\n return new Promise<void>((resolve, reject) => {\n const platform = process.platform;\n let command: string;\n let args: string[];\n\n if (platform === 'darwin') {\n command = 'open';\n args = [url];\n } else if (platform === 'win32') {\n command = 'start';\n args = [url];\n } else {\n command = 'xdg-open';\n args = [url];\n }\n\n const proc = spawn(command, args);\n proc.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error('Failed to open browser'));\n }\n });\n proc.on('error', reject);\n });\n },\n catch: (error) => new Error(`Failed to open browser: ${error}`),\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as AnsiDoc from '@effect/printer-ansi/AnsiDoc';\nimport * as Doc from '@effect/printer/Doc';\n\n/**\n * Pretty print document.\n */\nexport const print = (doc: Doc.Doc<any>) => AnsiDoc.render(doc, { style: 'pretty' });\n\n/**\n * Pretty prints a list of documents with ANSI colors.\n */\nexport const printList = (items: Array<Doc.Doc<any>>) =>\n AnsiDoc.render(Doc.vsep(items.map((item) => Doc.cat(item, Doc.hardLine))), { style: 'pretty' });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { ClientService } from '@dxos/client';\nimport { type Type } from '@dxos/echo';\n\n/** @deprecated Migrate to providing types via plugin capabilities. */\nexport const withTypes: (...types: Type.AnyEntity[]) => Effect.Effect<void, never, ClientService> = (...types) =>\n Effect.gen(function* () {\n const client = yield* ClientService;\n yield* Effect.promise(() => client.addTypes(types));\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\n\nimport { getPersonalSpace } from '@dxos/app-toolkit';\nimport { ClientService } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { QueueService } from '@dxos/compute';\nimport { Database, type Key } from '@dxos/echo';\nimport { BaseError, type BaseErrorOptions } from '@dxos/errors';\nimport { log } from '@dxos/log';\nimport { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { isBun } from '@dxos/util';\n\nexport const getSpace = (spaceId: Key.SpaceId): Effect.Effect<Space, SpaceNotFoundError, ClientService> =>\n Effect.gen(function* () {\n const client = yield* ClientService;\n return yield* Option.fromNullable(client.spaces.get(spaceId));\n }).pipe(Effect.catchTag('NoSuchElementException', () => Effect.fail(new SpaceNotFoundError(spaceId))));\n\nexport const spaceIdWithDefault = (spaceId: Option.Option<Key.SpaceId>) =>\n Effect.gen(function* () {\n const client = yield* ClientService;\n return Option.getOrElse(spaceId, () => {\n const personal = getPersonalSpace(client);\n if (!personal) {\n throw new Error('No space ID provided and no personal space found.');\n }\n return personal.id;\n });\n });\n\n// TODO(wittjosiah): Factor out.\nexport const spaceLayer = (\n spaceId$: Option.Option<Key.SpaceId>,\n fallbackToPersonalSpace = false,\n): Layer.Layer<Database.Service | QueueService, never, ClientService> => {\n const getSpace = Effect.fn(function* () {\n const client = yield* ClientService;\n\n // Resolution order when fallbackToPersonalSpace is true:\n // 1. the explicit spaceId arg (if provided);\n // 2. the space tagged `org.dxos.space.personal`;\n // 3. the first available space.\n // This keeps profiles created outside composer-app (which is what creates\n // the personal-space tag on identity creation) usable — the alternative\n // is a \"Space not found\" throw deep inside CredentialsService.\n const resolveSpace = () => {\n if (!fallbackToPersonalSpace) {\n return spaceId$.pipe(Option.flatMap((id) => Option.fromNullable(client.spaces.get(id))));\n }\n return spaceId$.pipe(\n Option.flatMap((id) => Option.fromNullable(client.spaces.get(id))),\n Option.orElse(() => Option.fromNullable(getPersonalSpace(client))),\n Option.orElse(() => Option.fromNullable(client.spaces.get()[0])),\n );\n };\n\n const space = resolveSpace().pipe(Option.getOrUndefined);\n\n if (space) {\n yield* Effect.promise(() => space.waitUntilReady());\n }\n return space;\n });\n\n // When no space can be resolved we install a stub whose `db` getter throws\n // on access — preserves the existing semantics for commands that *do* need\n // a db — but the release callback must NOT touch `db` or it will throw\n // during teardown (e.g. after a command emits a friendly error and\n // returns early). A shared sentinel object short-circuits the release.\n const NO_DB_STUB = {\n get db(): Database.Database {\n throw new Error('Space not found');\n },\n };\n const db = Layer.scoped(\n Database.Service,\n Effect.acquireRelease(\n Effect.gen(function* () {\n const space = yield* getSpace();\n if (!space) {\n return NO_DB_STUB;\n }\n return { db: space.db };\n }),\n (holder) => (holder === NO_DB_STUB ? Effect.void : Effect.promise(() => holder.db.flush())),\n ),\n );\n\n const queue = Layer.effect(\n QueueService,\n Effect.gen(function* () {\n const space = yield* getSpace();\n if (!space) {\n return {\n queues: {\n get: (_dxn) => {\n throw new Error('Queues not available');\n },\n create: () => {\n throw new Error('Queues not available');\n },\n },\n queue: undefined,\n };\n }\n return {\n queues: space.queues,\n queue: undefined,\n };\n }),\n );\n\n return Layer.merge(db, queue);\n};\n\n// TODO(dmaretskyi): There a race condition with edge connection not showing up.\nexport const waitForSync = Effect.fn(function* (space: Space) {\n // TODO(wittjosiah): Find a better way to do this.\n if (!isBun()) {\n // Skipping sync to edge when not in bun env as this indicates running a test.\n return;\n }\n\n // TODO(wittjosiah): This should probably be prompted for.\n if (space.internal.data.edgeReplication !== EdgeReplicationSetting.ENABLED) {\n yield* Console.log('Edge replication is disabled, enabling...');\n yield* Effect.promise(() => space.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED));\n }\n\n yield* Effect.promise(() =>\n space.internal.syncToEdge({\n onProgress: (state) => log.info('syncing', { state: state ?? 'no connection to edge' }),\n }),\n );\n yield* Console.log('Sync complete');\n});\n\nexport const flushAndSync = Effect.fn(function* (opts?: Database.FlushOptions) {\n yield* Database.flush(opts);\n const spaceId = yield* Database.spaceId;\n const space = yield* getSpace(spaceId);\n yield* waitForSync(space);\n});\n\n// TODO(burdon): Reconcile with @dxos/protocols\nexport class SpaceNotFoundError extends BaseError.extend('SpaceNotFoundError', 'Space not found') {\n constructor(spaceId: string, options?: Omit<BaseErrorOptions, 'context'>) {\n super({ context: { spaceId }, ...options });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\n\nimport { type Space, SpaceState, type SpaceSyncState } from '@dxos/client/echo';\n\nimport * as FormBuilder from './form-builder';\n\nexport type FormatSpaceOptions = {\n verbose?: boolean;\n truncateKeys?: boolean;\n /**\n * If set, wait up to this many seconds for the space to reach\n * `SPACE_READY` before reading its fields. If unset, read whatever state\n * is available right now — much safer for `space list` etc., where a\n * single stuck space would otherwise hang the entire command.\n */\n waitSeconds?: number;\n};\n\nconst DEFAULT_OPTIONS: Required<FormatSpaceOptions> = {\n verbose: false,\n truncateKeys: false,\n waitSeconds: 0,\n};\n\n/**\n * Per-async-read internal timeout. Some `space.internal.*` getters do\n * filesystem / network IO and can themselves hang on a partially-loaded\n * space; cap each one so the command can never be held hostage by SDK\n * internals.\n */\nconst READ_TIMEOUT_SECONDS = 2;\n\nconst tryWithFallback = <T>(label: string, run: () => Promise<T>, fallback: T) =>\n Effect.tryPromise(run).pipe(\n Effect.timeoutFail({\n duration: Duration.seconds(READ_TIMEOUT_SECONDS),\n onTimeout: () => new Error(`${label} timed out`),\n }),\n Effect.catchAll(() => Effect.succeed(fallback)),\n );\n\nconst tryWithFallbackSync = <T>(read: () => T, fallback: T): T => {\n try {\n return read();\n } catch {\n return fallback;\n }\n};\n\n// TODO(wittjosiah): Use @effect/printer.\nexport const formatSpace = Effect.fn(function* (space: Space, options: FormatSpaceOptions = {}) {\n const { waitSeconds } = { ...DEFAULT_OPTIONS, ...options };\n\n // Opt-in wait. Defaults to NO wait so a single stuck space can't hang\n // an enumeration command (e.g. `dx space list`).\n if (waitSeconds > 0) {\n yield* Effect.tryPromise(() => space.waitUntilReady()).pipe(\n Effect.timeoutFail({\n duration: Duration.seconds(waitSeconds),\n onTimeout: () => new Error('waitUntilReady timed out'),\n }),\n Effect.catchAll(() => Effect.void),\n );\n }\n\n const state = tryWithFallbackSync(() => space.state.get(), SpaceState.SPACE_INITIALIZING);\n const ready = state === SpaceState.SPACE_READY;\n\n // TODO(burdon): Factor out.\n // TODO(burdon): Agent needs to restart before `ready` is available.\n const metrics = tryWithFallbackSync(\n () => space.internal.data.metrics,\n undefined as { open?: Date; ready?: Date } | undefined,\n );\n const startup = metrics?.open && metrics?.ready ? metrics.ready.getTime() - metrics.open.getTime() : undefined;\n\n // TODO(burdon): Get feeds from client-services if verbose (factor out from devtools/diagnostics).\n // const host = client.services.services.DevtoolsHost!;\n const pipeline = tryWithFallbackSync(() => space.internal.data.pipeline, undefined);\n const epoch = pipeline?.currentEpoch?.subject.assertion.number;\n\n // The sync-state read does IO; cap it so a stuck space can't hang the\n // command. Falls back to a \"no peers\" placeholder.\n const syncStateRaw = yield* tryWithFallback('getSyncState', () => space.internal.db.coreDatabase.getSyncState(), {\n peers: {},\n } as SpaceSyncState);\n const syncState = aggregateSyncState(syncStateRaw);\n\n const name = ready ? tryWithFallbackSync(() => space.properties.name, undefined) : 'loading...';\n const members = tryWithFallbackSync(() => space.members.get().length, 0);\n const objects = tryWithFallbackSync(() => space.internal.db.coreDatabase.getAllObjectIds().length, 0);\n const key = options.truncateKeys\n ? tryWithFallbackSync(() => space.key.truncate(), '')\n : tryWithFallbackSync(() => space.key.toHex(), '');\n\n return {\n id: space.id,\n state: SpaceState[state],\n name,\n\n members,\n objects,\n\n key,\n epoch,\n startup,\n automergeRoot: pipeline?.spaceRootUrl,\n // appliedEpoch,\n syncState: `${syncState.count} ${getSyncIndicator(syncState.up, syncState.down)} (${syncState.peers} peers)`,\n };\n});\n\nconst aggregateSyncState = (syncState: SpaceSyncState) => {\n const peers = Object.keys(syncState.peers ?? {}).length;\n const missingOnLocal = Math.max(...Object.values(syncState.peers ?? {}).map((peer) => peer.missingOnLocal), 0);\n const missingOnRemote = Math.max(...Object.values(syncState.peers ?? {}).map((peer) => peer.missingOnRemote), 0);\n const differentDocuments = Math.max(\n ...Object.values(syncState.peers ?? {}).map((peer) => peer.differentDocuments),\n 0,\n );\n\n return {\n count: missingOnLocal + missingOnRemote + differentDocuments,\n peers,\n up: missingOnRemote > 0 || differentDocuments > 0,\n down: missingOnLocal > 0 || differentDocuments > 0,\n };\n};\n\nconst getSyncIndicator = (up: boolean, down: boolean) => {\n if (up) {\n if (down) {\n return '⇅';\n } else {\n return '↑';\n }\n } else {\n if (down) {\n return '↓';\n } else {\n return '✓';\n }\n }\n};\n\nexport type FormattedSpace = {\n id: string;\n state: string;\n name: string | undefined;\n members: number;\n objects: number;\n key: string;\n epoch: any;\n startup: number | undefined;\n automergeRoot: string | undefined;\n syncState: string;\n};\n\n/**\n * Pretty prints a space with ANSI colors.\n */\nexport const printSpace = (spaceData: FormattedSpace) =>\n FormBuilder.make({ title: spaceData.name ?? spaceData.id }).pipe(\n FormBuilder.set('id', spaceData.id),\n FormBuilder.set('state', spaceData.state),\n FormBuilder.set('key', spaceData.key),\n FormBuilder.set('members', spaceData.members),\n FormBuilder.set('objects', spaceData.objects),\n FormBuilder.set('epoch', spaceData.epoch ?? '<none>'),\n FormBuilder.set('startup', spaceData.startup ? `${spaceData.startup}ms` : '<none>'),\n FormBuilder.set('syncState', spaceData.syncState),\n FormBuilder.set('automergeRoot', spaceData.automergeRoot ?? '<none>'),\n FormBuilder.build,\n );\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Cause from 'effect/Cause';\nimport * as Config from 'effect/Config';\nimport type * as ConfigError from 'effect/ConfigError';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nexport const withTimeout: <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n) => Effect.Effect<A, Cause.TimeoutException | ConfigError.ConfigError | E, R> = Effect.fnUntraced(function* (effect) {\n const timeout = yield* Config.integer('TIMEOUT').pipe(Config.option);\n const duration = timeout.pipe(\n Option.map(Duration.millis),\n Option.getOrElse(() => Duration.infinity),\n );\n return yield* effect.pipe(Effect.timeout(duration));\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Ansi", "Doc", "Option", "Pipeable", "FormBuilderImpl", "entries", "title", "prefix", "options", "pipe", "pipeArguments", "arguments", "make", "props", "calculateDimensions", "maxKeyLen", "Math", "max", "map", "entry", "key", "length", "targetWidth", "buildKeyLine", "annotate", "fill", "text", "blackBright", "setImpl", "builder", "value", "color", "undefined", "valueDoc", "String", "ansi", "push", "isNested", "set", "builderOrKey", "keyOrValue", "valueOrColor", "nestImpl", "parent", "nestedBuilder", "build", "indent", "nest", "parentOrKey", "keyOrBuilder", "optionImpl", "isSome", "option", "nestedOptionImpl", "nestedOption", "whenImpl", "condition", "ops", "op", "when", "builderOrCondition", "conditionOrOp", "allOps", "filter", "eachImpl", "items", "fn", "forEach", "item", "each", "builderOrItems", "itemsOrFn", "entryLines", "keyLine", "hcat", "hardLine", "entriesDoc", "vsep", "titleDoc", "combine", "bold", "cyan", "cat", "line", "Options", "Key", "Common", "functionId", "text", "pipe", "withDescription", "spaceId", "withSchema", "SpaceId", "Effect", "spawn", "copyToClipboard", "text", "tryPromise", "try", "Promise", "resolve", "reject", "platform", "process", "command", "args", "proc", "stdin", "write", "end", "on", "code", "proc2", "code2", "Error", "catch", "error", "openBrowser", "url", "AnsiDoc", "Doc", "print", "doc", "render", "style", "printList", "items", "vsep", "map", "item", "cat", "hardLine", "Effect", "ClientService", "withTypes", "types", "gen", "client", "promise", "addTypes", "Console", "Effect", "Layer", "Option", "getPersonalSpace", "ClientService", "QueueService", "Database", "BaseError", "log", "EdgeReplicationSetting", "isBun", "getSpace", "client", "get", "pipe", "catchTag", "spaceIdWithDefault", "spaceId", "personal", "Error", "spaceId$", "flatMap", "id", "fromNullable", "spaces", "space", "resolveSpace", "getOrUndefined", "waitUntilReady", "NO_DB_STUB", "holder", "queues", "create", "queue", "promise", "setEdgeReplicationPreference", "internal", "syncToEdge", "state", "flushAndSync", "waitForSync", "context", "options", "Duration", "Effect", "SpaceState", "DEFAULT_OPTIONS", "verbose", "truncateKeys", "waitSeconds", "READ_TIMEOUT_SECONDS", "tryWithFallback", "label", "run", "fallback", "tryPromise", "pipe", "timeoutFail", "duration", "seconds", "onTimeout", "Error", "catchAll", "succeed", "tryWithFallbackSync", "read", "formatSpace", "fn", "space", "options", "waitUntilReady", "void", "state", "get", "SpaceState", "SPACE_INITIALIZING", "ready", "SPACE_READY", "metrics", "internal", "data", "undefined", "startup", "open", "getTime", "pipeline", "epoch", "currentEpoch", "subject", "assertion", "number", "syncStateRaw", "db", "coreDatabase", "getSyncState", "peers", "syncState", "aggregateSyncState", "name", "properties", "members", "length", "objects", "getAllObjectIds", "key", "truncate", "toHex", "id", "automergeRoot", "spaceRootUrl", "count", "getSyncIndicator", "up", "down", "Object", "keys", "missingOnLocal", "Math", "max", "values", "map", "peer", "missingOnRemote", "differentDocuments", "printSpace", "spaceData", "make", "title", "set", "build", "Config", "Duration", "Effect", "Option", "withTimeout", "fnUntraced", "effect", "timeout", "integer", "pipe", "option", "duration", "map", "millis", "getOrElse", "infinity"]
|
|
7
7
|
}
|