@sealant/mend 0.35.1 → 0.36.0-next.628
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-SMH65F6Z.js → chunk-OTYH35OK.js} +581 -4
- package/dist/{dashboard-MGR4YUFD.js → dashboard-P73HKQOT.js} +225 -98
- package/dist/main.js +2495 -490
- 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 +7 -7
- package/man/mend-completions.1 +1 -1
- package/man/mend-connect-pi.1 +28 -0
- package/man/mend-connect.1 +4 -2
- 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-memory-import.1 +23 -0
- package/man/mend-memory-rm.1 +15 -0
- package/man/mend-memory-show.1 +15 -0
- package/man/mend-memory.1 +32 -0
- package/man/mend-models.1 +22 -0
- 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-secrets-add.1 +24 -0
- package/man/mend-secrets-rm.1 +14 -0
- package/man/mend-secrets.1 +18 -0
- package/man/mend-server-logs.1 +1 -1
- package/man/mend-server-restart.1 +1 -1
- package/man/mend-server-setup.1 +27 -3
- package/man/mend-server-start.1 +1 -1
- package/man/mend-server-status.1 +5 -3
- package/man/mend-server-stop.1 +3 -3
- package/man/mend-server-upgrade.1 +7 -2
- 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 +2 -2
- 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-rm.1 +29 -0
- package/man/mend-worktrees.1 +2 -2
- package/man/mend.1 +35 -5
- package/package.json +19 -38
|
@@ -5,7 +5,7 @@ var __export = (target, all3) => {
|
|
|
5
5
|
};
|
|
6
6
|
|
|
7
7
|
// ../../packages/domain/src/workbench/harness-launch.ts
|
|
8
|
-
var EFFORT_LEVELS = ["low", "medium", "high", "xhigh", "max"];
|
|
8
|
+
var EFFORT_LEVELS = ["low", "medium", "high", "xhigh", "max", "ultra"];
|
|
9
9
|
var PERMISSION_MODES = ["bypass", "ask"];
|
|
10
10
|
|
|
11
11
|
// ../../packages/domain/src/workbench/agent-start.ts
|
|
@@ -26442,6 +26442,7 @@ var FollowUpId = Schema_exports.String.pipe(Schema_exports.brand("FollowUpId"));
|
|
|
26442
26442
|
var ReferenceId = Schema_exports.String.pipe(Schema_exports.brand("ReferenceId"));
|
|
26443
26443
|
var ProjectMountId = Schema_exports.String.pipe(Schema_exports.brand("ProjectMountId"));
|
|
26444
26444
|
var ProjectLinkId = Schema_exports.String.pipe(Schema_exports.brand("ProjectLinkId"));
|
|
26445
|
+
var SessionRepositoryId = Schema_exports.String.pipe(Schema_exports.brand("SessionRepositoryId"));
|
|
26445
26446
|
var SkillId = Schema_exports.String.pipe(Schema_exports.brand("SkillId"));
|
|
26446
26447
|
var SessionProcessId = Schema_exports.String.pipe(Schema_exports.brand("SessionProcessId"));
|
|
26447
26448
|
var AgentTurnId = Schema_exports.String.pipe(Schema_exports.brand("AgentTurnId"));
|
|
@@ -26456,6 +26457,7 @@ var ProjectEnvironmentVariableId = Schema_exports.String.pipe(
|
|
|
26456
26457
|
);
|
|
26457
26458
|
var ProjectSecretId = Schema_exports.String.pipe(Schema_exports.brand("ProjectSecretId"));
|
|
26458
26459
|
var ProjectClusterBindingId = Schema_exports.String.pipe(Schema_exports.brand("ProjectClusterBindingId"));
|
|
26460
|
+
var SecretFileId = Schema_exports.String.pipe(Schema_exports.brand("SecretFileId"));
|
|
26459
26461
|
var OrganizationId = Schema_exports.String.pipe(Schema_exports.brand("OrganizationId"));
|
|
26460
26462
|
var InvitationId = Schema_exports.String.pipe(Schema_exports.brand("InvitationId"));
|
|
26461
26463
|
var FolderId = Schema_exports.String.pipe(Schema_exports.brand("FolderId"));
|
|
@@ -26771,11 +26773,136 @@ var Project = class extends Schema_exports.Class("Project")({
|
|
|
26771
26773
|
installCommand: Schema_exports.NullOr(Schema_exports.String).pipe(
|
|
26772
26774
|
Schema_exports.withDecodingDefaultKey(Effect_exports.succeed(null))
|
|
26773
26775
|
),
|
|
26776
|
+
/**
|
|
26777
|
+
* "Automatic install": whether Mend runs the install command above (or the detected one) at
|
|
26778
|
+
* all. Off, neither a session's launch nor the install job runs one; restoring a dependency
|
|
26779
|
+
* tree from saved state, or a standby's from the shared cache, is unaffected. Older values
|
|
26780
|
+
* decode to on.
|
|
26781
|
+
*/
|
|
26782
|
+
installEnabled: Schema_exports.Boolean.pipe(Schema_exports.withDecodingDefaultKey(Effect_exports.succeed(true))),
|
|
26774
26783
|
createdAt: Timestamp,
|
|
26775
26784
|
updatedAt: Timestamp
|
|
26776
26785
|
}) {
|
|
26777
26786
|
};
|
|
26778
26787
|
|
|
26788
|
+
// ../../packages/domain/src/workbench/agent-memory.ts
|
|
26789
|
+
var AGENT_MEMORY_ROOTS = [
|
|
26790
|
+
{ harness: "claude", root: ".claude/projects/-workspace-repo/memory" },
|
|
26791
|
+
{ harness: "codex", root: ".codex/memories" },
|
|
26792
|
+
// Mend's own: the first line of each conversation Codex summarised on another machine
|
|
26793
|
+
// (`mend memory import`), so a session can list that conversation for Codex again.
|
|
26794
|
+
{ harness: "codex", root: ".mend/codex-threads" }
|
|
26795
|
+
];
|
|
26796
|
+
var AGENT_MEMORY_FILES = [{ harness: "codex", path: ".codex/memories_1.sqlite" }];
|
|
26797
|
+
var CODEX_MEMORY_DATABASE = ".codex/memories_1.sqlite";
|
|
26798
|
+
var AGENT_MEMORY_MAX_FILE_BYTES = 1024 * 1024;
|
|
26799
|
+
var AGENT_MEMORY_MAX_DATABASE_BYTES = 16 * 1024 * 1024;
|
|
26800
|
+
var AGENT_MEMORY_MAX_BYTES = 32 * 1024 * 1024;
|
|
26801
|
+
var AgentMemoryFile = class extends Schema_exports.Class("AgentMemoryFile")({
|
|
26802
|
+
path: Schema_exports.String,
|
|
26803
|
+
encoding: Schema_exports.Literals(["utf8", "base64"]),
|
|
26804
|
+
contents: Schema_exports.String
|
|
26805
|
+
}) {
|
|
26806
|
+
};
|
|
26807
|
+
var AgentMemoryEntry = class extends Schema_exports.Class("AgentMemoryEntry")({
|
|
26808
|
+
path: Schema_exports.String,
|
|
26809
|
+
/** Which harness keeps it. */
|
|
26810
|
+
harness: Schema_exports.String,
|
|
26811
|
+
/** Its path under that harness's memory root: what a person calls it. */
|
|
26812
|
+
name: Schema_exports.String,
|
|
26813
|
+
bytes: Schema_exports.Int,
|
|
26814
|
+
digest: Schema_exports.String,
|
|
26815
|
+
updatedAt: Timestamp,
|
|
26816
|
+
/** The session whose agent last wrote it, or null for an import. */
|
|
26817
|
+
updatedBySession: Schema_exports.NullOr(Schema_exports.String)
|
|
26818
|
+
}) {
|
|
26819
|
+
};
|
|
26820
|
+
var AgentMemoryView = class extends Schema_exports.Class("AgentMemoryView")({
|
|
26821
|
+
files: Schema_exports.Array(AgentMemoryEntry)
|
|
26822
|
+
}) {
|
|
26823
|
+
};
|
|
26824
|
+
var AgentMemoryFileView = class extends Schema_exports.Class("AgentMemoryFileView")({
|
|
26825
|
+
entry: AgentMemoryEntry,
|
|
26826
|
+
encoding: Schema_exports.Literals(["utf8", "base64"]),
|
|
26827
|
+
contents: Schema_exports.String
|
|
26828
|
+
}) {
|
|
26829
|
+
};
|
|
26830
|
+
var AgentMemoryImportSource = class extends Schema_exports.Class(
|
|
26831
|
+
"AgentMemoryImportSource"
|
|
26832
|
+
)({
|
|
26833
|
+
/** Stable for that checkout on that machine: the CLI's machine id and the checkout's path. */
|
|
26834
|
+
id: Schema_exports.String.check(Schema_exports.isMinLength(1), Schema_exports.isMaxLength(1024)),
|
|
26835
|
+
/** What a merge calls the machine where it has to say so: its host name. */
|
|
26836
|
+
label: Schema_exports.String.check(Schema_exports.isMinLength(1), Schema_exports.isMaxLength(64))
|
|
26837
|
+
}) {
|
|
26838
|
+
};
|
|
26839
|
+
var AgentMemoryImport = class extends Schema_exports.Class("AgentMemoryImport")({
|
|
26840
|
+
files: Schema_exports.Array(AgentMemoryFile),
|
|
26841
|
+
/** Absent from an older CLI: nothing is recorded then, and no merge has a shared version. */
|
|
26842
|
+
source: Schema_exports.optional(AgentMemoryImportSource)
|
|
26843
|
+
}) {
|
|
26844
|
+
};
|
|
26845
|
+
var AgentMemoryImportMerge = class extends Schema_exports.Class(
|
|
26846
|
+
"AgentMemoryImportMerge"
|
|
26847
|
+
)({
|
|
26848
|
+
path: Schema_exports.String,
|
|
26849
|
+
/**
|
|
26850
|
+
* - `last-import`: text, three-way against what this machine sent the last time;
|
|
26851
|
+
* - `no-shared-version`: text, both sides' lines with no version to diff against;
|
|
26852
|
+
* - `summaries`: Codex's summary database, each conversation's newer summary from either.
|
|
26853
|
+
*/
|
|
26854
|
+
against: Schema_exports.Literals(["last-import", "no-shared-version", "summaries"]),
|
|
26855
|
+
/**
|
|
26856
|
+
* How many of this machine's lines the result does not hold (a line Mend removed since the last
|
|
26857
|
+
* import is not counted). When any, this machine's file is kept whole as a version, and the next
|
|
26858
|
+
* import from there merges it again.
|
|
26859
|
+
*/
|
|
26860
|
+
missingLines: Schema_exports.Int,
|
|
26861
|
+
/**
|
|
26862
|
+
* How many of Mend's lines the result does not hold (a line this machine removed since its last
|
|
26863
|
+
* import is not counted). Mend's file is always kept as a version, pinned when it is the only
|
|
26864
|
+
* copy of a line.
|
|
26865
|
+
*/
|
|
26866
|
+
storeMissingLines: Schema_exports.Int
|
|
26867
|
+
}) {
|
|
26868
|
+
};
|
|
26869
|
+
var AgentMemoryImported = class extends Schema_exports.Class("AgentMemoryImported")({
|
|
26870
|
+
/** Not in Mend: stored as this machine has it. */
|
|
26871
|
+
added: Schema_exports.Array(Schema_exports.String),
|
|
26872
|
+
/** The same on both sides. */
|
|
26873
|
+
unchanged: Schema_exports.Array(Schema_exports.String),
|
|
26874
|
+
/** Unchanged in Mend since this machine's last import: replaced by this machine's. */
|
|
26875
|
+
updated: Schema_exports.Array(Schema_exports.String),
|
|
26876
|
+
/** Changed on both sides: merged, keeping both sides' lines. */
|
|
26877
|
+
merged: Schema_exports.Array(AgentMemoryImportMerge),
|
|
26878
|
+
/** Unchanged on this machine since its last import and changed in Mend: Mend's stays. */
|
|
26879
|
+
keptStored: Schema_exports.Array(Schema_exports.String),
|
|
26880
|
+
/** Removed in Mend since this machine's last import, unchanged here: not added again. */
|
|
26881
|
+
removedInMend: Schema_exports.Array(Schema_exports.String),
|
|
26882
|
+
/**
|
|
26883
|
+
* Changed on both sides and not mergeable: not text, frontmatter that differs outside the subset
|
|
26884
|
+
* merged by key, too different to align with no earlier import, or merged over the size limit.
|
|
26885
|
+
* Mend's stays, this machine's is kept as a version, and the next import reports it again.
|
|
26886
|
+
*/
|
|
26887
|
+
conflicting: Schema_exports.Array(Schema_exports.String),
|
|
26888
|
+
/** Outside the limits (path, size or count): not stored. */
|
|
26889
|
+
skipped: Schema_exports.Array(Schema_exports.String)
|
|
26890
|
+
}) {
|
|
26891
|
+
};
|
|
26892
|
+
var AgentMemoryRemoved = class extends Schema_exports.Class("AgentMemoryRemoved")({
|
|
26893
|
+
removed: Schema_exports.Boolean
|
|
26894
|
+
}) {
|
|
26895
|
+
};
|
|
26896
|
+
var agentMemoryNameOf = (filePath) => {
|
|
26897
|
+
for (const { harness, root } of AGENT_MEMORY_ROOTS) {
|
|
26898
|
+
if (filePath.startsWith(`${root}/`)) return { harness, name: filePath.slice(root.length + 1) };
|
|
26899
|
+
}
|
|
26900
|
+
for (const { harness, path: file } of AGENT_MEMORY_FILES) {
|
|
26901
|
+
if (filePath === file) return { harness, name: file.slice(file.lastIndexOf("/") + 1) };
|
|
26902
|
+
}
|
|
26903
|
+
return null;
|
|
26904
|
+
};
|
|
26905
|
+
|
|
26779
26906
|
// ../../packages/domain/src/workbench/connected-credential.ts
|
|
26780
26907
|
var CLAUDE_GRANT_SECTION = "claudeAiOauth";
|
|
26781
26908
|
var narrowCredential = (provider, secret) => {
|
|
@@ -26834,6 +26961,155 @@ var sameGrant = (left, right) => {
|
|
|
26834
26961
|
return a !== null && b !== null && a === b;
|
|
26835
26962
|
};
|
|
26836
26963
|
|
|
26964
|
+
// ../../packages/domain/src/workbench/launch-phase.ts
|
|
26965
|
+
var LAUNCH_WAITING_PREFIX = "waiting \xB7 the previous session in this worktree";
|
|
26966
|
+
var LAUNCH_WAITING_SAVING = `${LAUNCH_WAITING_PREFIX} is saving`;
|
|
26967
|
+
var LAUNCH_BOOTING = "booting";
|
|
26968
|
+
var LAUNCH_PREPARING = "preparing the workspace \xB7 no runtime yet \xB7 after an update, building the image takes about 8 minutes";
|
|
26969
|
+
var LAUNCH_BUILDING_IMAGE_LEGACY = "building the workspace image (first launch after an update, ~8 min)";
|
|
26970
|
+
var LAUNCH_PHASE_PREFIXES = [
|
|
26971
|
+
LAUNCH_WAITING_PREFIX,
|
|
26972
|
+
LAUNCH_BOOTING,
|
|
26973
|
+
LAUNCH_PREPARING,
|
|
26974
|
+
LAUNCH_BUILDING_IMAGE_LEGACY
|
|
26975
|
+
];
|
|
26976
|
+
var phaseWordsOf = (summary) => {
|
|
26977
|
+
for (const prefix of LAUNCH_PHASE_PREFIXES) {
|
|
26978
|
+
if (summary.startsWith(prefix)) return { at: 0, words: summary };
|
|
26979
|
+
const at = summary.indexOf(` \xB7 ${prefix}`);
|
|
26980
|
+
if (at >= 0) return { at, words: summary.slice(at + 3) };
|
|
26981
|
+
}
|
|
26982
|
+
return null;
|
|
26983
|
+
};
|
|
26984
|
+
var withoutLaunchPhase = (summary) => {
|
|
26985
|
+
if (summary === null) return null;
|
|
26986
|
+
const phase = phaseWordsOf(summary);
|
|
26987
|
+
if (phase === null) return summary;
|
|
26988
|
+
return phase.at === 0 ? null : summary.slice(0, phase.at);
|
|
26989
|
+
};
|
|
26990
|
+
var launchPhaseOf = (summary) => {
|
|
26991
|
+
if (summary === null) return null;
|
|
26992
|
+
const phase = phaseWordsOf(summary);
|
|
26993
|
+
if (phase === null) return null;
|
|
26994
|
+
if (phase.words.startsWith(LAUNCH_WAITING_PREFIX)) {
|
|
26995
|
+
return { kind: "waiting-previous", words: phase.words };
|
|
26996
|
+
}
|
|
26997
|
+
if (phase.words.startsWith(LAUNCH_BOOTING)) return { kind: "booting", words: phase.words };
|
|
26998
|
+
return { kind: "preparing", words: phase.words };
|
|
26999
|
+
};
|
|
27000
|
+
|
|
27001
|
+
// ../../packages/domain/src/workbench/pi-profile.ts
|
|
27002
|
+
var PI_PROFILE_AGENT_PATH = "mend/profile";
|
|
27003
|
+
var PI_PROFILE_LOCAL_PACKAGES = "packages";
|
|
27004
|
+
var PI_PROFILE_DIRECTORIES = ["extensions", "themes", "prompts", "packages"];
|
|
27005
|
+
var PI_PROFILE_FILES = [
|
|
27006
|
+
"settings.json",
|
|
27007
|
+
"package.json",
|
|
27008
|
+
"package-lock.json",
|
|
27009
|
+
"root/mcp.json",
|
|
27010
|
+
"root/keybindings.json"
|
|
27011
|
+
];
|
|
27012
|
+
var PI_PROFILE_MAX_FILES = 4e3;
|
|
27013
|
+
var PI_PROFILE_MAX_FILE_BYTES = 8 * 1024 * 1024;
|
|
27014
|
+
var PI_PROFILE_MAX_BYTES = 16 * 1024 * 1024;
|
|
27015
|
+
var PI_PROFILE_MAX_PATH_LENGTH = 512;
|
|
27016
|
+
var PiProfileFile = class extends Schema_exports.Class("PiProfileFile")({
|
|
27017
|
+
/** Profile-relative POSIX path; validated by `validatePiProfileFilePath`. */
|
|
27018
|
+
path: Schema_exports.String,
|
|
27019
|
+
encoding: Schema_exports.Literals(["utf8", "base64"]),
|
|
27020
|
+
contents: Schema_exports.String
|
|
27021
|
+
}) {
|
|
27022
|
+
};
|
|
27023
|
+
var PiProfile = class extends Schema_exports.Class("PiProfile")({
|
|
27024
|
+
fileCount: Schema_exports.Int,
|
|
27025
|
+
bytes: Schema_exports.Int,
|
|
27026
|
+
/** The profile's top-level extensions: each file or directory under `extensions/`. */
|
|
27027
|
+
extensions: Schema_exports.Array(Schema_exports.String),
|
|
27028
|
+
/** The packages its `settings.json` declares, each as its source. */
|
|
27029
|
+
packages: Schema_exports.Array(Schema_exports.String),
|
|
27030
|
+
/** Changes whenever the files do: the tree digest a session compares against. */
|
|
27031
|
+
digest: Schema_exports.String,
|
|
27032
|
+
revision: Schema_exports.Int,
|
|
27033
|
+
updatedAt: Timestamp
|
|
27034
|
+
}) {
|
|
27035
|
+
};
|
|
27036
|
+
var PiProfileView = class extends Schema_exports.Class("PiProfileView")({
|
|
27037
|
+
profile: Schema_exports.NullOr(PiProfile)
|
|
27038
|
+
}) {
|
|
27039
|
+
};
|
|
27040
|
+
var PiProfileUpload = class extends Schema_exports.Class("PiProfileUpload")({
|
|
27041
|
+
files: Schema_exports.Array(PiProfileFile)
|
|
27042
|
+
}) {
|
|
27043
|
+
};
|
|
27044
|
+
var PiProfileSaved = class extends Schema_exports.Class("PiProfileSaved")({
|
|
27045
|
+
profile: PiProfile,
|
|
27046
|
+
changed: Schema_exports.Boolean
|
|
27047
|
+
}) {
|
|
27048
|
+
};
|
|
27049
|
+
var PiProfileRemoved = class extends Schema_exports.Class("PiProfileRemoved")({
|
|
27050
|
+
removed: Schema_exports.Boolean
|
|
27051
|
+
}) {
|
|
27052
|
+
};
|
|
27053
|
+
var piProfileFileBytes = (file) => {
|
|
27054
|
+
if (file.encoding === "utf8") return new TextEncoder().encode(file.contents);
|
|
27055
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(file.contents) || file.contents.length % 4 !== 0) return null;
|
|
27056
|
+
try {
|
|
27057
|
+
return Uint8Array.from(atob(file.contents), (char) => char.charCodeAt(0));
|
|
27058
|
+
} catch {
|
|
27059
|
+
return null;
|
|
27060
|
+
}
|
|
27061
|
+
};
|
|
27062
|
+
var validatePiProfileFilePath = (filePath) => {
|
|
27063
|
+
if (filePath.length === 0) return "a file path is required";
|
|
27064
|
+
if (filePath.length > PI_PROFILE_MAX_PATH_LENGTH) {
|
|
27065
|
+
return `${filePath} is longer than ${PI_PROFILE_MAX_PATH_LENGTH} characters`;
|
|
27066
|
+
}
|
|
27067
|
+
if (filePath.startsWith("/") || filePath.includes("\\") || filePath.includes("\0")) {
|
|
27068
|
+
return `${filePath} is not a relative POSIX path`;
|
|
27069
|
+
}
|
|
27070
|
+
const segments = filePath.split("/");
|
|
27071
|
+
if (segments.some((segment) => segment === "" || segment === "." || segment === "..")) {
|
|
27072
|
+
return `${filePath} must not contain empty, "." or ".." segments`;
|
|
27073
|
+
}
|
|
27074
|
+
if (PI_PROFILE_FILES.some((file) => file === filePath)) return null;
|
|
27075
|
+
const top = segments[0] ?? "";
|
|
27076
|
+
if (segments.length > 1 && PI_PROFILE_DIRECTORIES.some((directory) => directory === top)) {
|
|
27077
|
+
return null;
|
|
27078
|
+
}
|
|
27079
|
+
return `${filePath} is not part of a pi profile`;
|
|
27080
|
+
};
|
|
27081
|
+
var validatePiProfile = (files) => {
|
|
27082
|
+
if (files.length === 0) return "a pi profile needs at least one file";
|
|
27083
|
+
if (files.length > PI_PROFILE_MAX_FILES) {
|
|
27084
|
+
return `a pi profile is capped at ${PI_PROFILE_MAX_FILES} files`;
|
|
27085
|
+
}
|
|
27086
|
+
const seen = /* @__PURE__ */ new Set();
|
|
27087
|
+
let total = 0;
|
|
27088
|
+
for (const file of files) {
|
|
27089
|
+
const pathIssue = validatePiProfileFilePath(file.path);
|
|
27090
|
+
if (pathIssue !== null) return pathIssue;
|
|
27091
|
+
if (seen.has(file.path)) return `${file.path} appears twice`;
|
|
27092
|
+
seen.add(file.path);
|
|
27093
|
+
const bytes = piProfileFileBytes(file);
|
|
27094
|
+
if (bytes === null) return `${file.path} is not valid base64`;
|
|
27095
|
+
if (bytes.byteLength > PI_PROFILE_MAX_FILE_BYTES) {
|
|
27096
|
+
return `${file.path} is over ${PI_PROFILE_MAX_FILE_BYTES / (1024 * 1024)} MB`;
|
|
27097
|
+
}
|
|
27098
|
+
total += bytes.byteLength;
|
|
27099
|
+
}
|
|
27100
|
+
for (const filePath of seen) {
|
|
27101
|
+
const segments = filePath.split("/");
|
|
27102
|
+
for (let depth = 1; depth < segments.length; depth += 1) {
|
|
27103
|
+
const parent = segments.slice(0, depth).join("/");
|
|
27104
|
+
if (seen.has(parent)) return `${parent} is both a file and a directory`;
|
|
27105
|
+
}
|
|
27106
|
+
}
|
|
27107
|
+
if (total > PI_PROFILE_MAX_BYTES) {
|
|
27108
|
+
return `a pi profile is capped at ${PI_PROFILE_MAX_BYTES / (1024 * 1024)} MB in total`;
|
|
27109
|
+
}
|
|
27110
|
+
return null;
|
|
27111
|
+
};
|
|
27112
|
+
|
|
26837
27113
|
// ../../packages/domain/src/workbench/audit.ts
|
|
26838
27114
|
var AuditAction = Schema_exports.Literals([
|
|
26839
27115
|
"invitation.created",
|
|
@@ -26912,8 +27188,14 @@ var LandedPullRequest = Schema_exports.Struct({
|
|
|
26912
27188
|
number: Schema_exports.Int,
|
|
26913
27189
|
url: Schema_exports.String,
|
|
26914
27190
|
state: PullRequestState,
|
|
27191
|
+
/** Its title as `gh` last reported it; null when recorded before Mend kept it. */
|
|
27192
|
+
title: Schema_exports.NullOr(Schema_exports.String).pipe(Schema_exports.withDecodingDefaultKey(Effect_exports.succeed(null))),
|
|
26915
27193
|
observedAt: Timestamp
|
|
26916
27194
|
});
|
|
27195
|
+
var ChangePullRequest = Schema_exports.Struct({
|
|
27196
|
+
...LandedPullRequest.fields,
|
|
27197
|
+
adopted: Schema_exports.Boolean
|
|
27198
|
+
});
|
|
26917
27199
|
var ChangeLanding = class extends Schema_exports.Class("ChangeLanding")({
|
|
26918
27200
|
id: ChangeLandingId,
|
|
26919
27201
|
changeId: ChangeId,
|
|
@@ -27102,6 +27384,7 @@ var AgentTurnUsage = Schema_exports.Struct({
|
|
|
27102
27384
|
totalTokens: Schema_exports.NullOr(Schema_exports.Int),
|
|
27103
27385
|
contextWindow: Schema_exports.NullOr(Schema_exports.Int)
|
|
27104
27386
|
});
|
|
27387
|
+
var AgentTurnOrigin = Schema_exports.Literals(["request", "harness"]);
|
|
27105
27388
|
var AgentTurn = class extends Schema_exports.Class("AgentTurn")({
|
|
27106
27389
|
id: AgentTurnId,
|
|
27107
27390
|
sessionId: SessionId,
|
|
@@ -27110,6 +27393,10 @@ var AgentTurn = class extends Schema_exports.Class("AgentTurn")({
|
|
|
27110
27393
|
ordinal: Schema_exports.Int,
|
|
27111
27394
|
/** Mend user id, or null for a system-authored follow-up. */
|
|
27112
27395
|
author: Schema_exports.NullOr(Schema_exports.String),
|
|
27396
|
+
/** What opened the turn. A `harness` turn's input is what the agent was answering. */
|
|
27397
|
+
origin: AgentTurnOrigin.pipe(
|
|
27398
|
+
Schema_exports.withConstructorDefault(Effect_exports.succeed("request"))
|
|
27399
|
+
),
|
|
27113
27400
|
input: Schema_exports.String,
|
|
27114
27401
|
status: AgentTurnStatus,
|
|
27115
27402
|
providerTurnId: Schema_exports.NullOr(Schema_exports.String),
|
|
@@ -27132,6 +27419,24 @@ var AgentTurn = class extends Schema_exports.Class("AgentTurn")({
|
|
|
27132
27419
|
landingId: Schema_exports.NullOr(ChangeLandingId).pipe(
|
|
27133
27420
|
Schema_exports.withConstructorDefault(Effect_exports.succeed(null))
|
|
27134
27421
|
),
|
|
27422
|
+
/**
|
|
27423
|
+
* Whose login the turn ran on (`TurnPayer`), recorded when Mend sent it or the harness opened
|
|
27424
|
+
* it. Null on a turn never sent, one recorded before payers were, and where Mend cannot say.
|
|
27425
|
+
*/
|
|
27426
|
+
billedUserId: Schema_exports.NullOr(Schema_exports.String).pipe(
|
|
27427
|
+
Schema_exports.withDecodingDefaultKey(Effect_exports.succeed(null)),
|
|
27428
|
+
Schema_exports.withConstructorDefault(Effect_exports.succeed(null))
|
|
27429
|
+
),
|
|
27430
|
+
/** The connected account's id as Core reported it; null until Core reports one. */
|
|
27431
|
+
billedAccountId: Schema_exports.NullOr(Schema_exports.String).pipe(
|
|
27432
|
+
Schema_exports.withDecodingDefaultKey(Effect_exports.succeed(null)),
|
|
27433
|
+
Schema_exports.withConstructorDefault(Effect_exports.succeed(null))
|
|
27434
|
+
),
|
|
27435
|
+
/** The connected account's name when the turn ran (`default`, `work`). */
|
|
27436
|
+
billedAccountName: Schema_exports.NullOr(Schema_exports.String).pipe(
|
|
27437
|
+
Schema_exports.withDecodingDefaultKey(Effect_exports.succeed(null)),
|
|
27438
|
+
Schema_exports.withConstructorDefault(Effect_exports.succeed(null))
|
|
27439
|
+
),
|
|
27135
27440
|
createdAt: Timestamp,
|
|
27136
27441
|
startedAt: Schema_exports.NullOr(Timestamp),
|
|
27137
27442
|
endedAt: Schema_exports.NullOr(Timestamp)
|
|
@@ -27146,6 +27451,8 @@ var AgentItemKind = Schema_exports.Literals([
|
|
|
27146
27451
|
"file-change",
|
|
27147
27452
|
"tool-call",
|
|
27148
27453
|
"web-search",
|
|
27454
|
+
/** A background task the agent started: a workflow, a background agent or command. */
|
|
27455
|
+
"task",
|
|
27149
27456
|
"error",
|
|
27150
27457
|
"other"
|
|
27151
27458
|
]);
|
|
@@ -27218,6 +27525,43 @@ var AgentRequest = class extends Schema_exports.Class("AgentRequest")({
|
|
|
27218
27525
|
decidedAt: Schema_exports.NullOr(Timestamp)
|
|
27219
27526
|
}) {
|
|
27220
27527
|
};
|
|
27528
|
+
var AgentTaskStatus = Schema_exports.Literals([
|
|
27529
|
+
"running",
|
|
27530
|
+
"completed",
|
|
27531
|
+
"failed",
|
|
27532
|
+
"stopped",
|
|
27533
|
+
"paused"
|
|
27534
|
+
]);
|
|
27535
|
+
var AgentTaskAgent = Schema_exports.Struct({
|
|
27536
|
+
index: Schema_exports.Int,
|
|
27537
|
+
label: Schema_exports.String,
|
|
27538
|
+
phaseIndex: Schema_exports.NullOr(Schema_exports.Int),
|
|
27539
|
+
state: Schema_exports.String,
|
|
27540
|
+
model: Schema_exports.NullOr(Schema_exports.String),
|
|
27541
|
+
tokens: Schema_exports.NullOr(Schema_exports.Int),
|
|
27542
|
+
toolCalls: Schema_exports.NullOr(Schema_exports.Int),
|
|
27543
|
+
durationMs: Schema_exports.NullOr(Schema_exports.Int),
|
|
27544
|
+
lastTool: Schema_exports.NullOr(Schema_exports.String),
|
|
27545
|
+
/** The start of the agent's result, or of its error. */
|
|
27546
|
+
preview: Schema_exports.NullOr(Schema_exports.String)
|
|
27547
|
+
});
|
|
27548
|
+
var AgentTaskData = Schema_exports.Struct({
|
|
27549
|
+
taskId: Schema_exports.String,
|
|
27550
|
+
/** The harness's task type: `local_workflow`, `local_agent`, `local_bash`, … */
|
|
27551
|
+
taskType: Schema_exports.String,
|
|
27552
|
+
/** The workflow's name, when the task is one. */
|
|
27553
|
+
workflow: Schema_exports.NullOr(Schema_exports.String),
|
|
27554
|
+
description: Schema_exports.String,
|
|
27555
|
+
status: AgentTaskStatus,
|
|
27556
|
+
/** The harness's closing line, once the task ended. */
|
|
27557
|
+
summary: Schema_exports.NullOr(Schema_exports.String),
|
|
27558
|
+
error: Schema_exports.NullOr(Schema_exports.String),
|
|
27559
|
+
phases: Schema_exports.Array(Schema_exports.Struct({ index: Schema_exports.Int, title: Schema_exports.String })),
|
|
27560
|
+
agents: Schema_exports.Array(AgentTaskAgent),
|
|
27561
|
+
totalTokens: Schema_exports.NullOr(Schema_exports.Int),
|
|
27562
|
+
toolUses: Schema_exports.NullOr(Schema_exports.Int),
|
|
27563
|
+
durationMs: Schema_exports.NullOr(Schema_exports.Int)
|
|
27564
|
+
});
|
|
27221
27565
|
var AgentEventItem = Schema_exports.Struct({
|
|
27222
27566
|
providerItemId: Schema_exports.String,
|
|
27223
27567
|
providerTurnId: Schema_exports.String,
|
|
@@ -27243,6 +27587,11 @@ var AgentEvent = Schema_exports.Union([
|
|
|
27243
27587
|
Schema_exports.TaggedStruct("turn.started", {
|
|
27244
27588
|
providerTurnId: Schema_exports.String
|
|
27245
27589
|
}),
|
|
27590
|
+
/** The agent started a turn nobody sent; `reason` is what it is answering, when known. */
|
|
27591
|
+
Schema_exports.TaggedStruct("harness-turn.started", {
|
|
27592
|
+
providerTurnId: Schema_exports.String,
|
|
27593
|
+
reason: Schema_exports.String
|
|
27594
|
+
}),
|
|
27246
27595
|
Schema_exports.TaggedStruct("turn.completed", {
|
|
27247
27596
|
providerTurnId: Schema_exports.String,
|
|
27248
27597
|
status: Schema_exports.Literals(["completed", "interrupted", "failed", "cancelled"]),
|
|
@@ -27371,8 +27720,9 @@ var captureStatusLine = (facts) => {
|
|
|
27371
27720
|
...facts.captureIncompleteReason === CAPTURE_EXECUTOR_RETAINED ? [] : ["workspace kept"]
|
|
27372
27721
|
].join(" \xB7 ");
|
|
27373
27722
|
}
|
|
27723
|
+
const noneQueued = facts.capturePendingBytes === 0 || facts.capturePendingBytes === null && facts.capturePending === 0;
|
|
27374
27724
|
return [
|
|
27375
|
-
left === null ? "saving" : `saving \xB7 ${left} left`,
|
|
27725
|
+
noneQueued ? "saving \xB7 no uploads pending" : left === null ? "saving" : `saving \xB7 ${left} left`,
|
|
27376
27726
|
...overdue === null ? [] : [overdue]
|
|
27377
27727
|
].join(" \xB7 ");
|
|
27378
27728
|
}
|
|
@@ -27682,6 +28032,21 @@ var Session = class extends Schema_exports.Class("Session")({
|
|
|
27682
28032
|
worktreeId: WorktreeId,
|
|
27683
28033
|
/** The adapter that launched it: `codex` · `claude` · `opencode` · `custom`. */
|
|
27684
28034
|
harness: Schema_exports.String,
|
|
28035
|
+
/**
|
|
28036
|
+
* The model the session was started with, as the server resolved it (docs/models-audit.md): the
|
|
28037
|
+
* one the request named, else the harness's catalog default. Null for a harness with no catalog,
|
|
28038
|
+
* before launch, and on rows from before the column. A resume keeps it: the harness continues
|
|
28039
|
+
* the conversation on its own model.
|
|
28040
|
+
*/
|
|
28041
|
+
model: Schema_exports.NullOr(Schema_exports.String).pipe(
|
|
28042
|
+
Schema_exports.withDecodingDefaultKey(Effect_exports.succeed(null)),
|
|
28043
|
+
Schema_exports.withConstructorDefault(Effect_exports.succeed(null))
|
|
28044
|
+
),
|
|
28045
|
+
/** The effort the session was started with; null is the harness's own default. */
|
|
28046
|
+
effort: Schema_exports.NullOr(Schema_exports.Literals(EFFORT_LEVELS)).pipe(
|
|
28047
|
+
Schema_exports.withDecodingDefaultKey(Effect_exports.succeed(null)),
|
|
28048
|
+
Schema_exports.withConstructorDefault(Effect_exports.succeed(null))
|
|
28049
|
+
),
|
|
27685
28050
|
/** Provider-native session/thread id when the adapter can extract one. */
|
|
27686
28051
|
providerSessionId: Schema_exports.NullOr(Schema_exports.String),
|
|
27687
28052
|
/** Optional human label ("reaper retry storm"); sessions have no issue titles. */
|
|
@@ -27926,6 +28291,32 @@ var HotWorkspace = class extends Schema_exports.Class("HotWorkspace")({
|
|
|
27926
28291
|
}) {
|
|
27927
28292
|
};
|
|
27928
28293
|
|
|
28294
|
+
// ../../packages/domain/src/workbench/model-catalog.ts
|
|
28295
|
+
var HarnessModel = class extends Schema_exports.Class("HarnessModel")({
|
|
28296
|
+
id: Schema_exports.String,
|
|
28297
|
+
label: Schema_exports.String,
|
|
28298
|
+
/** The model a launch runs when the request names none; one per harness. */
|
|
28299
|
+
isDefault: Schema_exports.Boolean,
|
|
28300
|
+
/** The efforts this model takes when fewer than its harness's; null means the harness's. */
|
|
28301
|
+
efforts: Schema_exports.NullOr(Schema_exports.Array(Schema_exports.Literals(EFFORT_LEVELS)))
|
|
28302
|
+
}) {
|
|
28303
|
+
};
|
|
28304
|
+
var HarnessModelCatalog = class extends Schema_exports.Class("HarnessModelCatalog")({
|
|
28305
|
+
harness: Schema_exports.String,
|
|
28306
|
+
/** In the order the picker shows them; empty when the harness takes no model flag Mend knows. */
|
|
28307
|
+
models: Schema_exports.Array(HarnessModel),
|
|
28308
|
+
/**
|
|
28309
|
+
* The model a launch runs when none is named; null when the list is empty, or when the harness
|
|
28310
|
+
* chooses its own and no row is flagged (`HARNESSES_CHOOSING_THEIR_OWN_MODEL`).
|
|
28311
|
+
*/
|
|
28312
|
+
defaultModel: Schema_exports.NullOr(Schema_exports.String),
|
|
28313
|
+
/** What the harness CLI accepts at all; a model may take fewer. */
|
|
28314
|
+
efforts: Schema_exports.Array(Schema_exports.Literals(EFFORT_LEVELS)),
|
|
28315
|
+
/** Whether a launch may ask for priority processing. */
|
|
28316
|
+
fastCapable: Schema_exports.Boolean
|
|
28317
|
+
}) {
|
|
28318
|
+
};
|
|
28319
|
+
|
|
27929
28320
|
// ../../packages/domain/src/workbench/notifications.ts
|
|
27930
28321
|
var NotificationKind = Schema_exports.Literals(["finished", "needs-input", "failed"]);
|
|
27931
28322
|
var NotificationSettings = class extends Schema_exports.Class(
|
|
@@ -27950,6 +28341,47 @@ var DEFAULT_NOTIFICATION_SETTINGS = new NotificationSettings({
|
|
|
27950
28341
|
});
|
|
27951
28342
|
var SlackThreadReach = Schema_exports.Literals(["replies", "status", "none"]);
|
|
27952
28343
|
|
|
28344
|
+
// ../../packages/domain/src/workbench/harness-layout.ts
|
|
28345
|
+
var HarnessLayout = Schema_exports.Literals(["person", "shared"]);
|
|
28346
|
+
var HarnessLayoutSource = Schema_exports.Literals([
|
|
28347
|
+
"worktree",
|
|
28348
|
+
"operator",
|
|
28349
|
+
"capability",
|
|
28350
|
+
"flag",
|
|
28351
|
+
"fallback"
|
|
28352
|
+
]);
|
|
28353
|
+
var LINUX_UID_RANGE = { first: 4e4, last: 49999 };
|
|
28354
|
+
var LINUX_UID_FIRST = LINUX_UID_RANGE.first + 1;
|
|
28355
|
+
var MEND_GROUP = { name: "mend", gid: LINUX_UID_RANGE.first };
|
|
28356
|
+
var LinuxIdentity = class extends Schema_exports.Class("LinuxIdentity")({
|
|
28357
|
+
/** The account, Mend's user id: what names the person's saved directory. */
|
|
28358
|
+
accountId: Schema_exports.String,
|
|
28359
|
+
/** Login name (`linuxLoginNameOf`). */
|
|
28360
|
+
name: Schema_exports.String,
|
|
28361
|
+
uid: Schema_exports.Number
|
|
28362
|
+
}) {
|
|
28363
|
+
};
|
|
28364
|
+
|
|
28365
|
+
// ../../packages/domain/src/workbench/host-user-namespaces.ts
|
|
28366
|
+
var HOST_USER_NAMESPACE_FILES = [
|
|
28367
|
+
"/proc/sys/kernel/apparmor_restrict_unprivileged_userns",
|
|
28368
|
+
"/sys/module/apparmor/parameters/enabled",
|
|
28369
|
+
"/proc/sys/kernel/unprivileged_userns_clone"
|
|
28370
|
+
];
|
|
28371
|
+
var HOST_USER_NAMESPACE_SYSCTL_FILE = "/etc/sysctl.d/60-mend-rootless-docker.conf";
|
|
28372
|
+
var hostUserNamespacesOf = (readings) => {
|
|
28373
|
+
const restrict = readings.apparmorRestrictUnprivilegedUserns?.trim();
|
|
28374
|
+
const apparmorOff = readings.apparmorEnabled?.trim() === "N";
|
|
28375
|
+
if (restrict === "1" && !apparmorOff) {
|
|
28376
|
+
return { allowed: false, setting: "kernel.apparmor_restrict_unprivileged_userns = 0" };
|
|
28377
|
+
}
|
|
28378
|
+
if (readings.unprivilegedUsernsClone?.trim() === "0") {
|
|
28379
|
+
return { allowed: false, setting: "kernel.unprivileged_userns_clone = 1" };
|
|
28380
|
+
}
|
|
28381
|
+
return { allowed: true };
|
|
28382
|
+
};
|
|
28383
|
+
var hostUserNamespacesFix = (setting) => `echo '${setting}' | sudo tee ${HOST_USER_NAMESPACE_SYSCTL_FILE} && sudo sysctl --system`;
|
|
28384
|
+
|
|
27953
28385
|
// ../../packages/domain/src/workbench/link.ts
|
|
27954
28386
|
var ProjectLink = class extends Schema_exports.Class("ProjectLink")({
|
|
27955
28387
|
id: ProjectLinkId,
|
|
@@ -28004,7 +28436,7 @@ var ProjectClusterBindingsSnapshot = class extends Schema_exports.Class(
|
|
|
28004
28436
|
}) {
|
|
28005
28437
|
};
|
|
28006
28438
|
|
|
28007
|
-
// ../../node_modules/.pnpm/@sealant+api-contracts@0.
|
|
28439
|
+
// ../../node_modules/.pnpm/@sealant+api-contracts-next@0.39.0-next.694_effect@4.0.0-beta.93/node_modules/@sealant/api-contracts-next/dist/workspace-environment.js
|
|
28008
28440
|
var RESERVED_NAMES = new Map([
|
|
28009
28441
|
// Identity/process roots the daemon and shells own.
|
|
28010
28442
|
...[
|
|
@@ -28186,6 +28618,38 @@ var servicesHoldLine = (input) => {
|
|
|
28186
28618
|
return input.agentOutcome === null ? hold : `agent ${input.agentOutcome} \xB7 ${hold}`;
|
|
28187
28619
|
};
|
|
28188
28620
|
|
|
28621
|
+
// ../../packages/domain/src/workbench/repository.ts
|
|
28622
|
+
var SessionRepositoryState = Schema_exports.Literals(["adding", "ready", "failed", "missing"]);
|
|
28623
|
+
var SessionRepositoryCapture = Schema_exports.Literals(["nested", "own"]);
|
|
28624
|
+
var SessionRepositorySource = Schema_exports.Literals(["origin", "store"]);
|
|
28625
|
+
var SessionRepository = class extends Schema_exports.Class("SessionRepository")({
|
|
28626
|
+
id: SessionRepositoryId,
|
|
28627
|
+
sessionId: SessionId,
|
|
28628
|
+
/** The repository's project, never the session's own. */
|
|
28629
|
+
projectId: ProjectId,
|
|
28630
|
+
/** The worktree of that project this session works in. */
|
|
28631
|
+
worktreeId: WorktreeId,
|
|
28632
|
+
/** The directory name under `/workspace/repos/`. */
|
|
28633
|
+
name: Schema_exports.String,
|
|
28634
|
+
/** `repositoryPath(name)`, recorded so the record reads without computing. */
|
|
28635
|
+
path: Schema_exports.String,
|
|
28636
|
+
/** Mirrors of the worktree row, as the session's own `branch` and `baseSha` are. */
|
|
28637
|
+
branch: Schema_exports.String,
|
|
28638
|
+
baseSha: Sha,
|
|
28639
|
+
baseRef: Schema_exports.NullOr(Schema_exports.String),
|
|
28640
|
+
state: SessionRepositoryState,
|
|
28641
|
+
/** Why it `failed` or went `missing`, in the words the person reads. */
|
|
28642
|
+
error: Schema_exports.NullOr(Schema_exports.String),
|
|
28643
|
+
capture: SessionRepositoryCapture,
|
|
28644
|
+
source: SessionRepositorySource,
|
|
28645
|
+
/** The account that asked for it: the session's owner. */
|
|
28646
|
+
addedByUserId: Schema_exports.NullOr(Schema_exports.String),
|
|
28647
|
+
createdAt: Timestamp,
|
|
28648
|
+
updatedAt: Timestamp,
|
|
28649
|
+
readyAt: Schema_exports.NullOr(Timestamp)
|
|
28650
|
+
}) {
|
|
28651
|
+
};
|
|
28652
|
+
|
|
28189
28653
|
// ../../packages/domain/src/workbench/review-comment.ts
|
|
28190
28654
|
var CommentAuthor = Schema_exports.Literals(["reviewer", "mend"]);
|
|
28191
28655
|
var CommentState = Schema_exports.Literals(["draft", "open", "addressed", "dismissed"]);
|
|
@@ -28244,6 +28708,83 @@ var ReviewComment = class extends Schema_exports.Class("ReviewComment")({
|
|
|
28244
28708
|
}) {
|
|
28245
28709
|
};
|
|
28246
28710
|
|
|
28711
|
+
// ../../packages/domain/src/workbench/secret-file.ts
|
|
28712
|
+
var SECRET_FILE_MAX_BYTES = 256 * 1024;
|
|
28713
|
+
var SECRET_FILES_MAX_TOTAL_BYTES = 1024 * 1024;
|
|
28714
|
+
var SECRET_FILE_MAX_PATH_LENGTH = 512;
|
|
28715
|
+
var SECRET_FILE_RESERVED_PATHS = [
|
|
28716
|
+
".claude",
|
|
28717
|
+
".claude.json",
|
|
28718
|
+
".codex",
|
|
28719
|
+
".pi",
|
|
28720
|
+
".local/share/opencode",
|
|
28721
|
+
".local/state/opencode",
|
|
28722
|
+
".mend"
|
|
28723
|
+
];
|
|
28724
|
+
var SecretFile = class extends Schema_exports.Class("SecretFile")({
|
|
28725
|
+
id: SecretFileId,
|
|
28726
|
+
/** Home-relative POSIX path, as `validateSecretFilePath` accepts it. */
|
|
28727
|
+
path: Schema_exports.String,
|
|
28728
|
+
/** The last segment of `path`: what a list shows first. */
|
|
28729
|
+
name: Schema_exports.String,
|
|
28730
|
+
bytes: Schema_exports.Int,
|
|
28731
|
+
/** Grows with every replace; the content itself never appears. */
|
|
28732
|
+
revision: Schema_exports.Int,
|
|
28733
|
+
createdAt: Timestamp,
|
|
28734
|
+
updatedAt: Timestamp
|
|
28735
|
+
}) {
|
|
28736
|
+
};
|
|
28737
|
+
var SecretFilesView = class extends Schema_exports.Class("SecretFilesView")({
|
|
28738
|
+
files: Schema_exports.Array(SecretFile)
|
|
28739
|
+
}) {
|
|
28740
|
+
};
|
|
28741
|
+
var SecretFileUpload = class extends Schema_exports.Class("SecretFileUpload")({
|
|
28742
|
+
path: Schema_exports.String,
|
|
28743
|
+
encoding: Schema_exports.Literals(["utf8", "base64"]),
|
|
28744
|
+
contents: Schema_exports.String
|
|
28745
|
+
}) {
|
|
28746
|
+
};
|
|
28747
|
+
var SecretFileSaved = class extends Schema_exports.Class("SecretFileSaved")({
|
|
28748
|
+
file: SecretFile,
|
|
28749
|
+
action: Schema_exports.Literals(["created", "replaced"])
|
|
28750
|
+
}) {
|
|
28751
|
+
};
|
|
28752
|
+
var SecretFileRemoved = class extends Schema_exports.Class("SecretFileRemoved")({
|
|
28753
|
+
removed: Schema_exports.Boolean
|
|
28754
|
+
}) {
|
|
28755
|
+
};
|
|
28756
|
+
var validateSecretFilePath = (filePath) => {
|
|
28757
|
+
const syntax = validateSecretFilePathSyntax(filePath);
|
|
28758
|
+
if (syntax !== null) return syntax;
|
|
28759
|
+
const reserved = reservedSecretFileRoot(filePath);
|
|
28760
|
+
if (reserved !== null) {
|
|
28761
|
+
return `${filePath} is under ${reserved}, which sessions capture`;
|
|
28762
|
+
}
|
|
28763
|
+
return null;
|
|
28764
|
+
};
|
|
28765
|
+
var reservedSecretFileRoot = (filePath) => SECRET_FILE_RESERVED_PATHS.find(
|
|
28766
|
+
(prefix) => filePath === prefix || filePath.startsWith(`${prefix}/`)
|
|
28767
|
+
) ?? null;
|
|
28768
|
+
var validateSecretFilePathSyntax = (filePath) => {
|
|
28769
|
+
if (filePath.length === 0) return "a path under the home directory is required";
|
|
28770
|
+
if (filePath.length > SECRET_FILE_MAX_PATH_LENGTH) {
|
|
28771
|
+
return `${filePath} is longer than ${SECRET_FILE_MAX_PATH_LENGTH} characters`;
|
|
28772
|
+
}
|
|
28773
|
+
if (filePath.startsWith("/") || filePath.startsWith("~")) {
|
|
28774
|
+
return `${filePath} must be relative to the home directory, as .aws/credentials is`;
|
|
28775
|
+
}
|
|
28776
|
+
const control = [...filePath].some((char) => {
|
|
28777
|
+
const code = char.codePointAt(0) ?? 0;
|
|
28778
|
+
return code < 32 || code === 127;
|
|
28779
|
+
});
|
|
28780
|
+
if (filePath.includes("\\") || control) return `${filePath} is not a POSIX path`;
|
|
28781
|
+
const segments = filePath.split("/");
|
|
28782
|
+
if (segments.some((segment) => segment === "" || segment === "." || segment === "..")) {
|
|
28783
|
+
return `${filePath} must not contain empty, "." or ".." segments`;
|
|
28784
|
+
}
|
|
28785
|
+
return null;
|
|
28786
|
+
};
|
|
28787
|
+
|
|
28247
28788
|
// ../../packages/domain/src/workbench/service-recipe.ts
|
|
28248
28789
|
var ServiceRecipe = class extends Schema_exports.Class("ServiceRecipe")({
|
|
28249
28790
|
name: Schema_exports.String,
|
|
@@ -28359,6 +28900,7 @@ var ServiceView = class extends Schema_exports.Class("ServiceView")({
|
|
|
28359
28900
|
var SessionControlKind = Schema_exports.Literals([
|
|
28360
28901
|
"interrupt",
|
|
28361
28902
|
"terminal-attach",
|
|
28903
|
+
"terminal-watch",
|
|
28362
28904
|
"shell-open",
|
|
28363
28905
|
"stop",
|
|
28364
28906
|
"services-stop",
|
|
@@ -28377,6 +28919,7 @@ var SessionControlEvent = class extends Schema_exports.Class("SessionControlEven
|
|
|
28377
28919
|
createdAt: Timestamp
|
|
28378
28920
|
}) {
|
|
28379
28921
|
};
|
|
28922
|
+
var terminalReadOnlyLine = (ownerName) => `This session runs in a terminal. Only ${ownerName} types here; they can continue it as a conversation.`;
|
|
28380
28923
|
|
|
28381
28924
|
// ../../packages/domain/src/workbench/session-run.ts
|
|
28382
28925
|
var SessionRun = class extends Schema_exports.Class("SessionRun")({
|
|
@@ -28577,6 +29120,9 @@ var Worktree = class extends Schema_exports.Class("Worktree")({
|
|
|
28577
29120
|
}) {
|
|
28578
29121
|
};
|
|
28579
29122
|
|
|
29123
|
+
// ../../packages/domain/src/workbench/worktree-removal.ts
|
|
29124
|
+
var WORKTREE_REMOVAL_FORCE_HINT = "or pass force=true to remove it anyway";
|
|
29125
|
+
|
|
28580
29126
|
// src/shared.ts
|
|
28581
29127
|
import { spawnSync } from "node:child_process";
|
|
28582
29128
|
import * as path from "node:path";
|
|
@@ -28584,10 +29130,18 @@ var HARNESS_COMMANDS = {
|
|
|
28584
29130
|
codex: ["codex"],
|
|
28585
29131
|
claude: ["claude"],
|
|
28586
29132
|
opencode: ["opencode"],
|
|
29133
|
+
pi: ["pi"],
|
|
28587
29134
|
// Not a coding agent: a plain bash session in its own recorded worktree.
|
|
28588
29135
|
shell: ["bash"]
|
|
28589
29136
|
};
|
|
28590
|
-
var EFFORT_LEVELS2 = [
|
|
29137
|
+
var EFFORT_LEVELS2 = [
|
|
29138
|
+
"low",
|
|
29139
|
+
"medium",
|
|
29140
|
+
"high",
|
|
29141
|
+
"xhigh",
|
|
29142
|
+
"max",
|
|
29143
|
+
"ultra"
|
|
29144
|
+
];
|
|
28591
29145
|
var PENDING_ID_PREFIX = "pending:";
|
|
28592
29146
|
var pendingId = () => `${PENDING_ID_PREFIX}${crypto.randomUUID()}`;
|
|
28593
29147
|
var isPendingId = (id2) => id2.startsWith(PENDING_ID_PREFIX);
|
|
@@ -28847,6 +29401,9 @@ var trackBracketedPaste = (output, current) => {
|
|
|
28847
29401
|
return on > off;
|
|
28848
29402
|
};
|
|
28849
29403
|
var pasteBytes = (text, bracketed) => Buffer.from(bracketed ? `\x1B[200~${text}\x1B[201~` : text, "utf8");
|
|
29404
|
+
var firstPositional = (args2, valued) => args2.find(
|
|
29405
|
+
(argument, index2) => !argument.startsWith("--") && (index2 === 0 || !valued.includes(args2[index2 - 1] ?? ""))
|
|
29406
|
+
);
|
|
28850
29407
|
|
|
28851
29408
|
// src/server-request.ts
|
|
28852
29409
|
var MendRequestError = class extends Error {
|
|
@@ -28970,12 +29527,30 @@ export {
|
|
|
28970
29527
|
RepositoryCloneUrl,
|
|
28971
29528
|
landingFactsFromWire,
|
|
28972
29529
|
landingFactLine,
|
|
29530
|
+
AGENT_MEMORY_ROOTS,
|
|
29531
|
+
AGENT_MEMORY_FILES,
|
|
29532
|
+
CODEX_MEMORY_DATABASE,
|
|
29533
|
+
AGENT_MEMORY_MAX_FILE_BYTES,
|
|
29534
|
+
AGENT_MEMORY_MAX_DATABASE_BYTES,
|
|
29535
|
+
agentMemoryNameOf,
|
|
28973
29536
|
narrowCredential,
|
|
28974
29537
|
claudeGrantFacts,
|
|
28975
29538
|
sameGrant,
|
|
28976
29539
|
normalizeGitAuthor,
|
|
28977
29540
|
gitAuthorIssue,
|
|
29541
|
+
withoutLaunchPhase,
|
|
29542
|
+
launchPhaseOf,
|
|
29543
|
+
HOST_USER_NAMESPACE_FILES,
|
|
29544
|
+
hostUserNamespacesOf,
|
|
29545
|
+
hostUserNamespacesFix,
|
|
29546
|
+
PI_PROFILE_AGENT_PATH,
|
|
29547
|
+
PI_PROFILE_LOCAL_PACKAGES,
|
|
29548
|
+
PI_PROFILE_MAX_FILE_BYTES,
|
|
29549
|
+
validatePiProfile,
|
|
28978
29550
|
servicesHoldLine,
|
|
29551
|
+
validateSecretFilePath,
|
|
29552
|
+
terminalReadOnlyLine,
|
|
29553
|
+
WORKTREE_REMOVAL_FORCE_HINT,
|
|
28979
29554
|
HARNESS_COMMANDS,
|
|
28980
29555
|
pendingId,
|
|
28981
29556
|
isPendingId,
|
|
@@ -28994,9 +29569,11 @@ export {
|
|
|
28994
29569
|
gitOriginUrl,
|
|
28995
29570
|
gitTopLevel,
|
|
28996
29571
|
normalizeProjectName,
|
|
29572
|
+
csiUKeysOf,
|
|
28997
29573
|
isPasteChunk,
|
|
28998
29574
|
trackBracketedPaste,
|
|
28999
29575
|
pasteBytes,
|
|
29576
|
+
firstPositional,
|
|
29000
29577
|
MendRequestError,
|
|
29001
29578
|
spoken,
|
|
29002
29579
|
noAnswerError,
|