@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.
Files changed (89) hide show
  1. package/dist/{chunk-SMH65F6Z.js → chunk-OTYH35OK.js} +581 -4
  2. package/dist/{dashboard-MGR4YUFD.js → dashboard-P73HKQOT.js} +225 -98
  3. package/dist/main.js +2495 -490
  4. package/man/mend-accounts.1 +1 -1
  5. package/man/mend-adopt.1 +1 -1
  6. package/man/mend-attach.1 +1 -1
  7. package/man/mend-codex.1 +7 -7
  8. package/man/mend-completions.1 +1 -1
  9. package/man/mend-connect-pi.1 +28 -0
  10. package/man/mend-connect.1 +4 -2
  11. package/man/mend-continue.1 +1 -1
  12. package/man/mend-doctor.1 +1 -1
  13. package/man/mend-dotfiles-repo.1 +1 -1
  14. package/man/mend-dotfiles-sync.1 +1 -1
  15. package/man/mend-dotfiles.1 +1 -1
  16. package/man/mend-env-cluster.1 +1 -1
  17. package/man/mend-env-load.1 +1 -1
  18. package/man/mend-env-show.1 +1 -1
  19. package/man/mend-folder-create.1 +1 -1
  20. package/man/mend-folder-list.1 +1 -1
  21. package/man/mend-folder-push.1 +1 -1
  22. package/man/mend-folder-rm.1 +1 -1
  23. package/man/mend-git-author.1 +1 -1
  24. package/man/mend-help.1 +1 -1
  25. package/man/mend-invite.1 +1 -1
  26. package/man/mend-keys-init.1 +1 -1
  27. package/man/mend-keys-mode.1 +1 -1
  28. package/man/mend-keys-share.1 +1 -1
  29. package/man/mend-keys-show.1 +1 -1
  30. package/man/mend-land.1 +1 -1
  31. package/man/mend-login.1 +1 -1
  32. package/man/mend-logout.1 +1 -1
  33. package/man/mend-man.1 +1 -1
  34. package/man/mend-members.1 +1 -1
  35. package/man/mend-memory-import.1 +23 -0
  36. package/man/mend-memory-rm.1 +15 -0
  37. package/man/mend-memory-show.1 +15 -0
  38. package/man/mend-memory.1 +32 -0
  39. package/man/mend-models.1 +22 -0
  40. package/man/mend-operator-exposure.1 +1 -1
  41. package/man/mend-operator-gate.1 +1 -1
  42. package/man/mend-operator-grant-owner.1 +1 -1
  43. package/man/mend-operator-org-create.1 +1 -1
  44. package/man/mend-operator-org-invite-owner.1 +1 -1
  45. package/man/mend-operator-org-list.1 +1 -1
  46. package/man/mend-operator-org-rename.1 +1 -1
  47. package/man/mend-operator-reset-link.1 +1 -1
  48. package/man/mend-pair.1 +1 -1
  49. package/man/mend-projects.1 +1 -1
  50. package/man/mend-pull.1 +1 -1
  51. package/man/mend-refresh.1 +1 -1
  52. package/man/mend-rejoin.1 +1 -1
  53. package/man/mend-resume.1 +1 -1
  54. package/man/mend-run.1 +1 -1
  55. package/man/mend-secrets-add.1 +24 -0
  56. package/man/mend-secrets-rm.1 +14 -0
  57. package/man/mend-secrets.1 +18 -0
  58. package/man/mend-server-logs.1 +1 -1
  59. package/man/mend-server-restart.1 +1 -1
  60. package/man/mend-server-setup.1 +27 -3
  61. package/man/mend-server-start.1 +1 -1
  62. package/man/mend-server-status.1 +5 -3
  63. package/man/mend-server-stop.1 +3 -3
  64. package/man/mend-server-upgrade.1 +7 -2
  65. package/man/mend-server.1 +1 -1
  66. package/man/mend-service-add.1 +1 -1
  67. package/man/mend-service-connect.1 +1 -1
  68. package/man/mend-service-init.1 +1 -1
  69. package/man/mend-service-list.1 +1 -1
  70. package/man/mend-service-logs.1 +1 -1
  71. package/man/mend-service-restart.1 +1 -1
  72. package/man/mend-service-run.1 +1 -1
  73. package/man/mend-service-stop.1 +1 -1
  74. package/man/mend-session-share.1 +2 -2
  75. package/man/mend-sessions.1 +1 -1
  76. package/man/mend-shell.1 +1 -1
  77. package/man/mend-skills-push.1 +1 -1
  78. package/man/mend-skills.1 +1 -1
  79. package/man/mend-snake.1 +1 -1
  80. package/man/mend-ssh-setup.1 +1 -1
  81. package/man/mend-ssh.1 +1 -1
  82. package/man/mend-stop.1 +1 -1
  83. package/man/mend-ui.1 +1 -1
  84. package/man/mend-uninstall.1 +1 -1
  85. package/man/mend-version.1 +1 -1
  86. package/man/mend-worktrees-rm.1 +29 -0
  87. package/man/mend-worktrees.1 +2 -2
  88. package/man/mend.1 +35 -5
  89. 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.38.1_effect@4.0.0-beta.93/node_modules/@sealant/api-contracts/dist/workspace-environment.js
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 = ["low", "medium", "high", "xhigh", "max"];
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,