@sealant/mend 0.34.4 → 0.34.5
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/{chunk-AAAXHRWL.js → chunk-5DORQXQT.js} +34 -7
- package/dist/{dashboard-DWXXYFPE.js → dashboard-KZ4XGZ6W.js} +1 -1
- package/dist/main.js +60 -2
- package/man/mend-accounts.1 +1 -1
- package/man/mend-adopt.1 +1 -1
- package/man/mend-attach.1 +1 -1
- package/man/mend-codex.1 +1 -1
- package/man/mend-completions.1 +1 -1
- package/man/mend-connect.1 +1 -1
- package/man/mend-continue.1 +1 -1
- package/man/mend-doctor.1 +1 -1
- package/man/mend-dotfiles-repo.1 +1 -1
- package/man/mend-dotfiles-sync.1 +1 -1
- package/man/mend-dotfiles.1 +1 -1
- package/man/mend-env-cluster.1 +1 -1
- package/man/mend-env-load.1 +1 -1
- package/man/mend-env-show.1 +1 -1
- package/man/mend-folder-create.1 +1 -1
- package/man/mend-folder-list.1 +1 -1
- package/man/mend-folder-push.1 +1 -1
- package/man/mend-folder-rm.1 +1 -1
- package/man/mend-git-author.1 +1 -1
- package/man/mend-help.1 +1 -1
- package/man/mend-invite.1 +1 -1
- package/man/mend-keys-init.1 +1 -1
- package/man/mend-keys-mode.1 +1 -1
- package/man/mend-keys-share.1 +1 -1
- package/man/mend-keys-show.1 +1 -1
- package/man/mend-land.1 +1 -1
- package/man/mend-login.1 +1 -1
- package/man/mend-logout.1 +1 -1
- package/man/mend-man.1 +1 -1
- package/man/mend-members.1 +1 -1
- package/man/mend-operator-exposure.1 +1 -1
- package/man/mend-operator-gate.1 +1 -1
- package/man/mend-operator-grant-owner.1 +1 -1
- package/man/mend-operator-org-create.1 +1 -1
- package/man/mend-operator-org-invite-owner.1 +1 -1
- package/man/mend-operator-org-list.1 +1 -1
- package/man/mend-operator-org-rename.1 +1 -1
- package/man/mend-operator-reset-link.1 +1 -1
- package/man/mend-pair.1 +1 -1
- package/man/mend-projects.1 +1 -1
- package/man/mend-pull.1 +1 -1
- package/man/mend-refresh.1 +1 -1
- package/man/mend-rejoin.1 +1 -1
- package/man/mend-resume.1 +1 -1
- package/man/mend-run.1 +1 -1
- package/man/mend-server-logs.1 +1 -1
- package/man/mend-server-restart.1 +1 -1
- package/man/mend-server-setup.1 +1 -1
- package/man/mend-server-start.1 +1 -1
- package/man/mend-server-status.1 +1 -1
- package/man/mend-server-stop.1 +1 -1
- package/man/mend-server-upgrade.1 +1 -1
- package/man/mend-server.1 +1 -1
- package/man/mend-service-add.1 +1 -1
- package/man/mend-service-connect.1 +1 -1
- package/man/mend-service-init.1 +1 -1
- package/man/mend-service-list.1 +1 -1
- package/man/mend-service-logs.1 +1 -1
- package/man/mend-service-restart.1 +1 -1
- package/man/mend-service-run.1 +1 -1
- package/man/mend-service-stop.1 +1 -1
- package/man/mend-session-share.1 +1 -1
- package/man/mend-sessions.1 +1 -1
- package/man/mend-shell.1 +1 -1
- package/man/mend-skills-push.1 +1 -1
- package/man/mend-skills.1 +1 -1
- package/man/mend-snake.1 +1 -1
- package/man/mend-ssh-setup.1 +1 -1
- package/man/mend-ssh.1 +1 -1
- package/man/mend-stop.1 +1 -1
- package/man/mend-ui.1 +1 -1
- package/man/mend-uninstall.1 +1 -1
- package/man/mend-version.1 +1 -1
- package/man/mend-worktrees.1 +1 -1
- package/man/mend.1 +1 -1
- package/package.json +3 -3
|
@@ -4,6 +4,26 @@ var __export = (target, all3) => {
|
|
|
4
4
|
__defProp(target, name, { get: all3[name], enumerable: true });
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
+
// ../../packages/domain/src/workbench/harness-launch.ts
|
|
8
|
+
var EFFORT_LEVELS = ["low", "medium", "high", "xhigh", "max"];
|
|
9
|
+
var PERMISSION_MODES = ["bypass", "ask"];
|
|
10
|
+
|
|
11
|
+
// ../../packages/domain/src/workbench/agent-start.ts
|
|
12
|
+
var agentStartingLine = (label, facts, elapsedMs) => `${label} is starting${facts.freshMachine ? " on the new machine" : ""} \xB7 ${Math.max(0, Math.round(elapsedMs / 1e3))}s`;
|
|
13
|
+
var MAX_TRUSTED_ELAPSED_MS = 60 * 60 * 1e3;
|
|
14
|
+
var timeOf = (value3) => value3 === void 0 ? Number.NaN : typeof value3 === "string" ? Date.parse(value3) : value3.getTime();
|
|
15
|
+
var agentStartingFacts = (currentAgent, processes, now2) => {
|
|
16
|
+
if (currentAgent === null || currentAgent === void 0) {
|
|
17
|
+
return { startedAt: null, freshMachine: false };
|
|
18
|
+
}
|
|
19
|
+
const created = timeOf(currentAgent.createdAt);
|
|
20
|
+
const trusted = Number.isFinite(created) && created <= now2 && now2 - created <= MAX_TRUSTED_ELAPSED_MS;
|
|
21
|
+
const freshMachine = processes !== void 0 && currentAgent.sealantWorkspaceId !== void 0 && Number.isFinite(created) && !processes.some(
|
|
22
|
+
(process2) => process2.id !== currentAgent.id && process2.sealantWorkspaceId === currentAgent.sealantWorkspaceId && timeOf(process2.createdAt) < created
|
|
23
|
+
);
|
|
24
|
+
return { startedAt: trusted ? created : null, freshMachine };
|
|
25
|
+
};
|
|
26
|
+
|
|
7
27
|
// ../../node_modules/.pnpm/effect@4.0.0-beta.93/node_modules/effect/dist/Pipeable.js
|
|
8
28
|
var pipeArguments = (self, args2) => {
|
|
9
29
|
switch (args2.length) {
|
|
@@ -27325,7 +27345,7 @@ var leftWords = (facts) => {
|
|
|
27325
27345
|
return null;
|
|
27326
27346
|
};
|
|
27327
27347
|
var utcTime = (at) => `${at.toISOString().slice(11, 19)} UTC`;
|
|
27328
|
-
var
|
|
27348
|
+
var timeOf2 = (at) => {
|
|
27329
27349
|
if (at === null || at === void 0) return null;
|
|
27330
27350
|
const date2 = typeof at === "string" ? new Date(at) : at;
|
|
27331
27351
|
return Number.isNaN(date2.getTime()) ? null : date2;
|
|
@@ -27357,7 +27377,7 @@ var captureStatusLine = (facts) => {
|
|
|
27357
27377
|
].join(" \xB7 ");
|
|
27358
27378
|
}
|
|
27359
27379
|
if (overdue !== null) return overdue;
|
|
27360
|
-
const failingSince =
|
|
27380
|
+
const failingSince = timeOf2(facts.captureFailingSince);
|
|
27361
27381
|
if (failingSince !== null) {
|
|
27362
27382
|
const error = facts.captureFailingError ?? null;
|
|
27363
27383
|
return [
|
|
@@ -27366,7 +27386,7 @@ var captureStatusLine = (facts) => {
|
|
|
27366
27386
|
].join(" \xB7 ");
|
|
27367
27387
|
}
|
|
27368
27388
|
if ((facts.captureRefused ?? 0) > 0) return `not saved \xB7 ${facts.captureRefused} refused`;
|
|
27369
|
-
const discardedAt =
|
|
27389
|
+
const discardedAt = timeOf2(facts.captureDiscardedAt);
|
|
27370
27390
|
if (discardedAt !== null) {
|
|
27371
27391
|
const by = facts.captureDiscardedBy ?? null;
|
|
27372
27392
|
return `unsaved work discarded${by === null || by === "" ? "" : ` by ${by}`} at ${utcTime(discardedAt)}`;
|
|
@@ -27560,10 +27580,6 @@ var FollowUp = class extends Schema_exports.Class("FollowUp")({
|
|
|
27560
27580
|
}) {
|
|
27561
27581
|
};
|
|
27562
27582
|
|
|
27563
|
-
// ../../packages/domain/src/workbench/harness-launch.ts
|
|
27564
|
-
var EFFORT_LEVELS = ["low", "medium", "high", "xhigh", "max"];
|
|
27565
|
-
var PERMISSION_MODES = ["bypass", "ask"];
|
|
27566
|
-
|
|
27567
27583
|
// ../../packages/domain/src/workbench/mount.ts
|
|
27568
27584
|
var ProjectMount = class extends Schema_exports.Class("ProjectMount")({
|
|
27569
27585
|
id: ProjectMountId,
|
|
@@ -28125,6 +28141,15 @@ var SessionProcess = class extends Schema_exports.Class("SessionProcess")({
|
|
|
28125
28141
|
/** Services: the host port Mend binds on its private interfaces. */
|
|
28126
28142
|
hostPort: Schema_exports.NullOr(Schema_exports.Int),
|
|
28127
28143
|
createdAt: Timestamp,
|
|
28144
|
+
/**
|
|
28145
|
+
* When the process's record first carried output: the first screen an agent drew. Null while
|
|
28146
|
+
* it has drawn nothing, for a process with no run of ours, and on rows from before it was
|
|
28147
|
+
* observed. Older servers omit it.
|
|
28148
|
+
*/
|
|
28149
|
+
firstOutputAt: Schema_exports.NullOr(Timestamp).pipe(
|
|
28150
|
+
Schema_exports.withDecodingDefaultKey(Effect_exports.succeed(null)),
|
|
28151
|
+
Schema_exports.withConstructorDefault(Effect_exports.succeed(null))
|
|
28152
|
+
),
|
|
28128
28153
|
exitedAt: Schema_exports.NullOr(Timestamp),
|
|
28129
28154
|
updatedAt: Timestamp
|
|
28130
28155
|
}) {
|
|
@@ -28915,6 +28940,8 @@ var eventFamilies = (payload) => {
|
|
|
28915
28940
|
};
|
|
28916
28941
|
|
|
28917
28942
|
export {
|
|
28943
|
+
agentStartingLine,
|
|
28944
|
+
agentStartingFacts,
|
|
28918
28945
|
repositoryCloneUrlIssue,
|
|
28919
28946
|
RepositoryCloneUrl,
|
|
28920
28947
|
landingFactsFromWire,
|
package/dist/main.js
CHANGED
|
@@ -6,6 +6,8 @@ import {
|
|
|
6
6
|
MendRequestError,
|
|
7
7
|
agentIsLive,
|
|
8
8
|
agentOutcome,
|
|
9
|
+
agentStartingFacts,
|
|
10
|
+
agentStartingLine,
|
|
9
11
|
captureLineOf,
|
|
10
12
|
claudeGrantFacts,
|
|
11
13
|
createSseParser,
|
|
@@ -32,7 +34,7 @@ import {
|
|
|
32
34
|
sessionDisplayName,
|
|
33
35
|
spoken,
|
|
34
36
|
trackBracketedPaste
|
|
35
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-5DORQXQT.js";
|
|
36
38
|
|
|
37
39
|
// src/main.ts
|
|
38
40
|
import { spawn as spawn3, spawnSync as spawnSync5 } from "node:child_process";
|
|
@@ -175,6 +177,45 @@ var startAgentShare = (options) => {
|
|
|
175
177
|
};
|
|
176
178
|
};
|
|
177
179
|
|
|
180
|
+
// src/attach-starting.ts
|
|
181
|
+
var startingLabelOf = (harness) => harness === "run" ? "the command" : harness === "shell" ? "the shell" : harness;
|
|
182
|
+
var CLEAR_LINE = "\r\x1B[2K";
|
|
183
|
+
var startingLine = (label, facts, elapsedMs, cancelHint) => `${CLEAR_LINE} ${agentStartingLine(label, facts, elapsedMs)}${cancelHint === "" ? "" : ` \xB7 ${cancelHint}`}`;
|
|
184
|
+
var firstOutputGate = (options) => {
|
|
185
|
+
const attachedAt = options.now();
|
|
186
|
+
let facts = { startedAt: null, freshMachine: false };
|
|
187
|
+
let shown = false;
|
|
188
|
+
let done = false;
|
|
189
|
+
let interval = null;
|
|
190
|
+
const draw = () => {
|
|
191
|
+
if (done) return;
|
|
192
|
+
shown = true;
|
|
193
|
+
const since = facts.startedAt ?? attachedAt;
|
|
194
|
+
options.write(startingLine(options.label, facts, options.now() - since, options.cancelHint));
|
|
195
|
+
};
|
|
196
|
+
const grace = setTimeout(() => {
|
|
197
|
+
draw();
|
|
198
|
+
interval = setInterval(draw, options.intervalMs ?? 1e3);
|
|
199
|
+
}, options.graceMs ?? 400);
|
|
200
|
+
const finish = () => {
|
|
201
|
+
if (done) return;
|
|
202
|
+
done = true;
|
|
203
|
+
clearTimeout(grace);
|
|
204
|
+
if (interval !== null) clearInterval(interval);
|
|
205
|
+
if (shown) options.write(CLEAR_LINE);
|
|
206
|
+
shown = false;
|
|
207
|
+
};
|
|
208
|
+
return {
|
|
209
|
+
pass: finish,
|
|
210
|
+
stop: finish,
|
|
211
|
+
update: (next) => {
|
|
212
|
+
facts = next;
|
|
213
|
+
if (shown) draw();
|
|
214
|
+
},
|
|
215
|
+
shown: () => shown
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
|
|
178
219
|
// src/claude-grant.ts
|
|
179
220
|
import { spawnSync } from "node:child_process";
|
|
180
221
|
import { createHash } from "node:crypto";
|
|
@@ -8043,9 +8084,12 @@ var attachTty = async (config, sessionId, harness, from, processId, options) =>
|
|
|
8043
8084
|
};
|
|
8044
8085
|
const onWinch = () => sendResize();
|
|
8045
8086
|
let bracketedPaste = false;
|
|
8087
|
+
let starting = null;
|
|
8046
8088
|
const onTtyFrame = (event) => {
|
|
8047
8089
|
if (typeof event.data !== "string") {
|
|
8048
8090
|
const bytes = Buffer.from(event.data);
|
|
8091
|
+
if (bytes.length === 0) return;
|
|
8092
|
+
starting?.pass();
|
|
8049
8093
|
bracketedPaste = trackBracketedPaste(bytes, bracketedPaste);
|
|
8050
8094
|
process.stdout.write(bytes);
|
|
8051
8095
|
return;
|
|
@@ -8156,6 +8200,19 @@ var attachTty = async (config, sessionId, harness, from, processId, options) =>
|
|
|
8156
8200
|
if (connected === "unavailable") return "unavailable";
|
|
8157
8201
|
if (connected === "aborted") return abortReason ?? "interrupted";
|
|
8158
8202
|
ws = connected;
|
|
8203
|
+
if (interactive && processId === void 0 && process.stdout.isTTY === true) {
|
|
8204
|
+
const gate = firstOutputGate({
|
|
8205
|
+
label: startingLabelOf(harness),
|
|
8206
|
+
write: (text) => process.stdout.write(text),
|
|
8207
|
+
now: Date.now,
|
|
8208
|
+
cancelHint: detachKeyEnabled ? "Ctrl+] detaches" : ""
|
|
8209
|
+
});
|
|
8210
|
+
starting = gate;
|
|
8211
|
+
void request(config, "GET", `/sessions/${sessionId}`).then(
|
|
8212
|
+
(detail) => gate.update(agentStartingFacts(detail.currentAgent, detail.processes, Date.now())),
|
|
8213
|
+
() => void 0
|
|
8214
|
+
);
|
|
8215
|
+
}
|
|
8159
8216
|
stopHerdrHint = hintHerdrAttachment(harness);
|
|
8160
8217
|
const onClose = () => finishAttachment?.();
|
|
8161
8218
|
if (ws.readyState === WebSocket.CLOSED) finishAttachment?.();
|
|
@@ -8169,6 +8226,7 @@ var attachTty = async (config, sessionId, harness, from, processId, options) =>
|
|
|
8169
8226
|
return detached ? "detached" : interrupted ? "interrupted" : sawEnd ? "ended" : "dropped";
|
|
8170
8227
|
} finally {
|
|
8171
8228
|
stopConnecting();
|
|
8229
|
+
starting?.stop();
|
|
8172
8230
|
for (const signal of signals) process.off(signal, onSignal);
|
|
8173
8231
|
process.stdin.off("data", onKeys);
|
|
8174
8232
|
process.stdout.off("resize", onWinch);
|
|
@@ -10380,7 +10438,7 @@ var dashboard = async (config, options = {}) => {
|
|
|
10380
10438
|
);
|
|
10381
10439
|
process.exit(rerun.status ?? 0);
|
|
10382
10440
|
}
|
|
10383
|
-
const { runDashboard } = await import("./dashboard-
|
|
10441
|
+
const { runDashboard } = await import("./dashboard-KZ4XGZ6W.js");
|
|
10384
10442
|
const agentShare = await startShareIfBridge(config);
|
|
10385
10443
|
const tunnels = options.noTunnel === true || serverIsLocal(config) ? null : createServiceTunnels({
|
|
10386
10444
|
listServices: () => fetchServices(config),
|
package/man/mend-accounts.1
CHANGED
package/man/mend-adopt.1
CHANGED
package/man/mend-attach.1
CHANGED
package/man/mend-codex.1
CHANGED
package/man/mend-completions.1
CHANGED
package/man/mend-connect.1
CHANGED
package/man/mend-continue.1
CHANGED
package/man/mend-doctor.1
CHANGED
package/man/mend-dotfiles-repo.1
CHANGED
package/man/mend-dotfiles-sync.1
CHANGED
package/man/mend-dotfiles.1
CHANGED
package/man/mend-env-cluster.1
CHANGED
package/man/mend-env-load.1
CHANGED
package/man/mend-env-show.1
CHANGED
package/man/mend-folder-create.1
CHANGED
package/man/mend-folder-list.1
CHANGED
package/man/mend-folder-push.1
CHANGED
package/man/mend-folder-rm.1
CHANGED
package/man/mend-git-author.1
CHANGED
package/man/mend-help.1
CHANGED
package/man/mend-invite.1
CHANGED
package/man/mend-keys-init.1
CHANGED
package/man/mend-keys-mode.1
CHANGED
package/man/mend-keys-share.1
CHANGED
package/man/mend-keys-show.1
CHANGED
package/man/mend-land.1
CHANGED
package/man/mend-login.1
CHANGED
package/man/mend-logout.1
CHANGED
package/man/mend-man.1
CHANGED
package/man/mend-members.1
CHANGED
package/man/mend-operator-gate.1
CHANGED
package/man/mend-pair.1
CHANGED
package/man/mend-projects.1
CHANGED
package/man/mend-pull.1
CHANGED
package/man/mend-refresh.1
CHANGED
package/man/mend-rejoin.1
CHANGED
package/man/mend-resume.1
CHANGED
package/man/mend-run.1
CHANGED
package/man/mend-server-logs.1
CHANGED
package/man/mend-server-setup.1
CHANGED
package/man/mend-server-start.1
CHANGED
package/man/mend-server-status.1
CHANGED
package/man/mend-server-stop.1
CHANGED
package/man/mend-server.1
CHANGED
package/man/mend-service-add.1
CHANGED
package/man/mend-service-init.1
CHANGED
package/man/mend-service-list.1
CHANGED
package/man/mend-service-logs.1
CHANGED
package/man/mend-service-run.1
CHANGED
package/man/mend-service-stop.1
CHANGED
package/man/mend-session-share.1
CHANGED
package/man/mend-sessions.1
CHANGED
package/man/mend-shell.1
CHANGED
package/man/mend-skills-push.1
CHANGED
package/man/mend-skills.1
CHANGED
package/man/mend-snake.1
CHANGED
package/man/mend-ssh-setup.1
CHANGED
package/man/mend-ssh.1
CHANGED
package/man/mend-stop.1
CHANGED
package/man/mend-ui.1
CHANGED
package/man/mend-uninstall.1
CHANGED
package/man/mend-version.1
CHANGED
package/man/mend-worktrees.1
CHANGED
package/man/mend.1
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sealant/mend",
|
|
3
|
-
"version": "0.34.
|
|
3
|
+
"version": "0.34.5",
|
|
4
4
|
"description": "The mend CLI: adopt a repository into Mend's store, launch your coding agent in a recorded session worktree, detach and reattach from any terminal",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
|
@@ -47,9 +47,9 @@
|
|
|
47
47
|
"esbuild": "^0.28.1",
|
|
48
48
|
"typescript": "^5.7.2",
|
|
49
49
|
"vitest": "^3.0.5",
|
|
50
|
-
"@mend/typescript": "0.0.0",
|
|
51
50
|
"@mend/domain": "0.0.0",
|
|
52
|
-
"@mend/workspace-ssh": "0.0.0"
|
|
51
|
+
"@mend/workspace-ssh": "0.0.0",
|
|
52
|
+
"@mend/typescript": "0.0.0"
|
|
53
53
|
},
|
|
54
54
|
"engines": {
|
|
55
55
|
"node": ">=22"
|