@metaphi-ai/hum 0.1.33 → 0.1.35

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 (2) hide show
  1. package/dist/cli.mjs +99 -16
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -75838,7 +75838,7 @@ function runningVersion(candidates = engineCandidates(), opts = {}) {
75838
75838
  }
75839
75839
  return null;
75840
75840
  }
75841
- function startFailure(failures, { npm = /^(node|bun)(\.exe)?$/i.test(String(process.execPath).split(/[\\/]/).pop()), platform: platform2 = process.platform, version = true ? "0.1.33" : "" } = {}) {
75841
+ function startFailure(failures, { npm = /^(node|bun)(\.exe)?$/i.test(String(process.execPath).split(/[\\/]/).pop()), platform: platform2 = process.platform, version = true ? "0.1.35" : "" } = {}) {
75842
75842
  const refused = failures.find((f) => f.error && f.error.code !== "ENOENT");
75843
75843
  const fix = npm ? npmFix(version) : updateCommand({ kind: "native" }, platform2);
75844
75844
  if (!refused) {
@@ -84541,7 +84541,7 @@ var input_default = MultilineInput;
84541
84541
 
84542
84542
  // src/app.jsx
84543
84543
  var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
84544
- var MINE = true ? "0.1.33" : "";
84544
+ var MINE = true ? "0.1.35" : "";
84545
84545
  var fmtDur = (s) => s < 60 ? `${Math.max(1, Math.round(s))}s` : `${Math.floor(s / 60)}m ${Math.round(s % 60)}s`;
84546
84546
  var plural = (n, w) => `${n} ${w}${n === 1 ? "" : "s"}`;
84547
84547
  var firstResp = (e) => e.first_response_s ? ` \xB7 first response ${e.first_response_s.toFixed(1)}s` : "";
@@ -84633,8 +84633,8 @@ var REWIND_CHOICES = [
84633
84633
  { key: "chat", label: "restore the conversation", desc: "hum carries on from what you said, on a new branch; nothing is deleted" },
84634
84634
  { key: "both", label: "both", desc: "" }
84635
84635
  ];
84636
- var OUTPUT_MAX_LINES = 200;
84637
84636
  var ERR_TAIL_LINES = 5;
84637
+ var THOUGHT_TAIL_LINES = 3;
84638
84638
  var diagLine = (d) => `${d.file ? `${d.file}${d.line != null ? `:${d.line}` : ""}: ` : ""}${d.severity || "error"}: ${d.message || ""}`;
84639
84639
  var tallyLine = (tally) => Object.entries(tally).map(([name, t]) => {
84640
84640
  const short = name.includes("__") ? name.split("__")[1] : name;
@@ -84668,6 +84668,9 @@ function App2({ engine: engine2, task, resume, images = [] }) {
84668
84668
  const [confirm, setConfirm] = (0, import_react24.useState)(null);
84669
84669
  const [gate, setGate] = (0, import_react24.useState)("off");
84670
84670
  const [paused, setPaused] = (0, import_react24.useState)(false);
84671
+ const [reflections, setReflections] = (0, import_react24.useState)([]);
84672
+ const [why, setWhy] = (0, import_react24.useState)(null);
84673
+ const reflection = phase === "idle" && !proposal && !question ? reflections[0] || null : null;
84671
84674
  const attachRef = (0, import_react24.useRef)([]);
84672
84675
  const inputRef = (0, import_react24.useRef)(null);
84673
84676
  const nextId = (0, import_react24.useRef)(0);
@@ -84987,6 +84990,9 @@ function App2({ engine: engine2, task, resume, images = [] }) {
84987
84990
  case "proposal":
84988
84991
  foldThinking();
84989
84992
  flushDraft();
84993
+ (ev.calls || []).forEach((c) => {
84994
+ if (c.diff) append({ kind: "output", name: `${c.desc} \xB7 the whole change`, lines: c.diff.split("\n"), diff: true });
84995
+ });
84990
84996
  setProposal({ content: ev.content || "", calls: ev.calls || [], remember: ev.remember || [], remember_text: ev.remember_text || "" });
84991
84997
  setStatus("waiting for your decision");
84992
84998
  break;
@@ -85013,6 +85019,16 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85013
85019
  setQCursor(0);
85014
85020
  append({ kind: "info", text: `answered: ${ev.answer}` });
85015
85021
  break;
85022
+ case "mcp":
85023
+ append({ kind: "mcp", servers: ev.servers || [] });
85024
+ break;
85025
+ case "reflection":
85026
+ setReflections((rs) => rs.some((r) => r.id === ev.id) ? rs : [...rs, { id: ev.id, category: ev.category || "other", title: ev.title || "", details: ev.details || "", area: ev.area || "" }]);
85027
+ break;
85028
+ case "reflection_closed":
85029
+ setReflections((rs) => rs.filter((r) => r.id !== ev.id));
85030
+ if (ev.vote !== "dismiss") append({ kind: "info", text: ev.vote === "up" ? "marked true" : "marked false" });
85031
+ break;
85016
85032
  case "paused":
85017
85033
  foldThinking();
85018
85034
  flushDraft();
@@ -85181,8 +85197,7 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85181
85197
  if (key.ctrl && input === "o") {
85182
85198
  const last = lastOutRef.current;
85183
85199
  if (last && last.content) {
85184
- const ls = last.content.split("\n");
85185
- append({ kind: "output", name: last.name, lines: ls.slice(0, OUTPUT_MAX_LINES), more: Math.max(0, ls.length - OUTPUT_MAX_LINES) });
85200
+ append({ kind: "output", name: last.name, lines: last.content.split("\n") });
85186
85201
  }
85187
85202
  return;
85188
85203
  }
@@ -85227,6 +85242,23 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85227
85242
  else if (/^[1-3]$/.test(input)) pick(REWIND_CHOICES[Number(input) - 1].key);
85228
85243
  return;
85229
85244
  }
85245
+ if (reflection && !picker && !value.trim()) {
85246
+ if (why === reflection.id) {
85247
+ if (key.escape) {
85248
+ closeReflection(reflection.id, "down");
85249
+ }
85250
+ return;
85251
+ }
85252
+ const vote = input === "1" ? "up" : input === "2" ? "down" : key.return || key.escape ? "dismiss" : null;
85253
+ if (vote === "down") {
85254
+ setWhy(reflection.id);
85255
+ return;
85256
+ }
85257
+ if (vote) {
85258
+ closeReflection(reflection.id, vote);
85259
+ return;
85260
+ }
85261
+ }
85230
85262
  if (proposal && !picker) {
85231
85263
  if (key.return && !value.trim()) {
85232
85264
  decide("accept");
@@ -85458,12 +85490,22 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85458
85490
  break;
85459
85491
  }
85460
85492
  };
85493
+ const closeReflection = (id, vote, reason = "") => {
85494
+ engine2.send({ cmd: "reflect_vote", id, vote, ...reason ? { why: reason } : {} });
85495
+ setReflections((rs) => rs.filter((r) => r.id !== id));
85496
+ setWhy((w) => w === id ? null : w);
85497
+ setValue("");
85498
+ };
85461
85499
  const onSubmit = (line) => {
85462
85500
  const text = line.trim();
85463
85501
  setValue("");
85464
85502
  const queued = attachRef.current;
85465
85503
  const attached = text ? queued.filter((a) => text.includes(a.chip)) : queued;
85466
85504
  const dropped = queued.filter((a) => !attached.includes(a));
85505
+ if (why && reflection && why === reflection.id) {
85506
+ closeReflection(reflection.id, "down", text);
85507
+ return;
85508
+ }
85467
85509
  if (!text && attached.length === 0) return;
85468
85510
  if (!text && proposal) return;
85469
85511
  const hist = historyRef.current;
@@ -85479,6 +85521,7 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85479
85521
  answerStep(text);
85480
85522
  return;
85481
85523
  }
85524
+ if (reflection) closeReflection(reflection.id, "dismiss");
85482
85525
  if (text.startsWith("/")) {
85483
85526
  runCommand(text);
85484
85527
  return;
@@ -85489,10 +85532,6 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85489
85532
  if (phaseRef.current === "idle") setPhaseBoth("busy");
85490
85533
  return;
85491
85534
  }
85492
- if (paused && /^(continue|go on|carry on|keep going)\.?$/i.test(text)) {
85493
- runCommand("/continue");
85494
- return;
85495
- }
85496
85535
  if (paused) setPaused(false);
85497
85536
  if (dropped.length) append({ kind: "info", text: `not sent (chip removed): ${dropped.map((a) => a.label).join(", ")}` });
85498
85537
  append({ kind: "you", text, images: attached.map((a) => `#${a.n} ${a.label}`), steering: phaseRef.current === "busy" });
@@ -85620,8 +85659,7 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85620
85659
  item.kind === "errtail" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Box_default, { flexDirection: "column", paddingLeft: 6, children: item.lines.map((l, i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: "red", dimColor: true, children: l }, i)) }),
85621
85660
  item.kind === "output" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "column", paddingLeft: 4, children: [
85622
85661
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: `full output \xB7 ${item.name}` }),
85623
- item.lines.map((l, i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: l || " " }, i)),
85624
- item.more > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: `\u2026 +${item.more} more lines (the session file keeps everything)` }) : null
85662
+ item.lines.map((l, i) => item.diff ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: l.startsWith("+") ? "green" : l.startsWith("-") ? "red" : void 0, dimColor: !l.startsWith("+") && !l.startsWith("-"), children: l || " " }, i) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: l || " " }, i))
85625
85663
  ] }),
85626
85664
  item.kind === "turn" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { children: [
85627
85665
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: ACCENT, children: "\u273B " }),
@@ -85635,6 +85673,28 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85635
85673
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { children: item.text }),
85636
85674
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: "say what to do next \xB7 /continue lets it carry on" })
85637
85675
  ] }),
85676
+ item.kind === "mcp" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "column", children: [
85677
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { children: [
85678
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { bold: true, color: ACCENT, children: "MCP servers" }),
85679
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: ` \xB7 ${item.servers.length} in this session` })
85680
+ ] }),
85681
+ item.servers.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: " none \xB7 add [[mcp]] with a name and a url or a command to ~/.hum/config.toml; the ones your deployment provides arrive when you sign in" }) : null,
85682
+ [["deployment", "from your deployment"], ["config", "from your config (~/.hum/config.toml or the project's .hum/config.toml)"]].map(([src, label]) => {
85683
+ const rows = item.servers.filter((s) => (s.source || "config") === src);
85684
+ if (!rows.length) return null;
85685
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "column", marginTop: 1, children: [
85686
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: ` ${label}` }),
85687
+ rows.map((s) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "column", paddingLeft: 2, children: [
85688
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { children: [
85689
+ s.error ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: "red", children: "\u2717 " }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: "green", children: "\u2714 " }),
85690
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { bold: true, children: s.name }),
85691
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: s.error ? ` \xB7 not mounted \xB7 ${s.error}` : ` \xB7 connected \xB7 ${s.tools.length} tool${s.tools.length === 1 ? "" : "s"}${s.instructions ? " \xB7 with instructions" : ""} \xB7 ${s.at}` })
85692
+ ] }),
85693
+ s.tools.length ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: ` ${s.tools.join(" \xB7 ")}` }) : null
85694
+ ] }, s.name))
85695
+ ] }, src);
85696
+ })
85697
+ ] }),
85638
85698
  item.kind === "info" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: item.text }),
85639
85699
  item.kind === "warn" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: "yellow", children: item.text }),
85640
85700
  item.kind === "error" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: "red", children: item.text })
@@ -85647,6 +85707,9 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85647
85707
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Box_default, { width: 2, flexShrink: 0, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: ACCENT, dimColor: true, children: "\u25CF" }) }),
85648
85708
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { children: tail(renderMarkdown(draft, width - 2), DRAFT_TAIL_LINES) })
85649
85709
  ] }),
85710
+ phase === "busy" && thinking && // the thought as it streams: its newest lines, dim, so a long think is never a blank screen.
85711
+ // It folds into one line under the reply the moment the reply starts
85712
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Box_default, { flexDirection: "column", marginTop: 1, paddingLeft: 2, width, children: thinking.slice(-600).split("\n").filter((l) => l.trim()).slice(-THOUGHT_TAIL_LINES).map((l, i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, wrap: "truncate-start", children: l }, i)) }),
85650
85713
  (phase === "busy" || phase === "connecting") && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { marginTop: 1, children: [
85651
85714
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: ACCENT, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(build_default, { type: "dots" }) }),
85652
85715
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: spinnerLabel })
@@ -85682,6 +85745,25 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85682
85745
  step.secret ? " \xB7 it is not shown and not recorded" : ""
85683
85746
  ] })
85684
85747
  ] }),
85748
+ reflection && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { borderStyle: "round", borderColor: ACCENT, paddingX: 1, marginTop: 1, children: [
85749
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Box_default, { flexDirection: "column", width: MASCOT_WIDTH + 1, flexShrink: 0, marginRight: 1, children: MASCOT.map((row, i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: ACCENT, bold: true, children: row }, i)) }),
85750
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "column", flexGrow: 1, children: [
85751
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { children: [
85752
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: ACCENT, bold: true, children: "\u2726 hum on its own work" }),
85753
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: ` \xB7 ${reflection.category.replace(/_/g, " ")}${reflection.area ? ` \xB7 ${reflection.area}` : ""}` })
85754
+ ] }),
85755
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { bold: true, children: reflection.title }),
85756
+ reflection.details.split("\n").map((l, i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { children: ` ${l}` }, `d${i}`)),
85757
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { children: " " }),
85758
+ why === reflection.id ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { children: [
85759
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { bold: true, children: "What did it get wrong? " }),
85760
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: "type a line and press enter \xB7 enter alone records the no without a reason" })
85761
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { children: [
85762
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { bold: true, children: "Is this true? " }),
85763
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: `press 1 for yes \xB7 2 for no \xB7 enter to skip${reflections.length > 1 ? ` \xB7 ${reflections.length - 1} more after this` : ""}` })
85764
+ ] })
85765
+ ] })
85766
+ ] }),
85685
85767
  proposal && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "column", borderStyle: "round", borderColor: ACCENT, paddingX: 1, marginTop: 1, children: [
85686
85768
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { children: [
85687
85769
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: ACCENT, bold: true, children: "? " }),
@@ -85710,7 +85792,7 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85710
85792
  ] }),
85711
85793
  (c.name === "bash" || c.name === "powershell") && c.desc !== `$ ${String(c.args?.command || "")}` ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { color: "cyan", children: [
85712
85794
  " $ ",
85713
- String(c.args?.command || "").split("\n").join(" \u23CE ").slice(0, 300)
85795
+ String(c.args?.command || "").split("\n").join(" \u23CE ")
85714
85796
  ] }) : null,
85715
85797
  c.escape ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { color: "yellow", children: [
85716
85798
  " outside the sandbox \u2014 ",
@@ -85728,7 +85810,7 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85728
85810
  },
85729
85811
  i
85730
85812
  )) : null,
85731
- c.diff && c.diff.split("\n").length > DIFF_TAIL_LINES ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: ` \u2026 +${c.diff.split("\n").length - DIFF_TAIL_LINES} more diff lines` }) : null
85813
+ c.diff && c.diff.split("\n").length > DIFF_TAIL_LINES ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { dimColor: true, children: ` the whole change (${c.diff.split("\n").length} lines) is above` }) : null
85732
85814
  ] }, c.id))
85733
85815
  ] }),
85734
85816
  picker && picker.kind === "model" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "column", paddingX: 1, marginTop: 1, children: [
@@ -85888,12 +85970,13 @@ function App2({ engine: engine2, task, resume, images = [] }) {
85888
85970
  mask: !!(step && step.secret),
85889
85971
  swallow: (input, key) => {
85890
85972
  if (picker || value.trim()) return false;
85973
+ if (reflection && why !== reflection.id && (input === "1" || input === "2")) return true;
85891
85974
  if (proposal && (input === "a" || input === "p") && (proposal.remember || []).length) return true;
85892
85975
  if (!question || !step) return false;
85893
85976
  if (/^[1-9]$/.test(input) && Number(input) <= stepLabels.length) return true;
85894
85977
  return !!(step.multi && stepLabels.length && input === " ");
85895
85978
  },
85896
- placeholder: question && step ? stepLabels.length ? "a number, or your answer" : "your answer" : proposal ? (proposal.remember || []).length ? "enter approves \xB7 a / p allow this shape \xB7 or type why not" : "enter to approve \xB7 or type why not" : paused ? "paused \xB7 say what to do, or /continue" : phase === "busy" ? "type to steer \xB7 esc to stop \xB7 !cmd runs a command" : session ? "what next?" : "what are we doing?"
85979
+ placeholder: why && reflection && why === reflection.id ? "what did it get wrong? (enter alone: just the no)" : question && step ? stepLabels.length ? "a number, or your answer" : "your answer" : proposal ? (proposal.remember || []).length ? "enter approves \xB7 a / p allow this shape \xB7 or type why not" : "enter to approve \xB7 or type why not" : paused ? "paused \xB7 say what to do, or /continue" : phase === "busy" ? "type to steer \xB7 esc to stop \xB7 !cmd runs a command" : session ? "what next?" : "what are we doing?"
85897
85980
  }
85898
85981
  )
85899
85982
  ] }),
@@ -85917,7 +86000,7 @@ init_update();
85917
86000
  init_install();
85918
86001
  var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
85919
86002
  import { spawnSync as spawnSync5 } from "node:child_process";
85920
- var MINE2 = true ? "0.1.33" : "0.0.0";
86003
+ var MINE2 = true ? "0.1.35" : "0.0.0";
85921
86004
  var layout = installLayout();
85922
86005
  function completeInstall() {
85923
86006
  if (layout.kind !== "npm" || !needsInstall(MINE2)) return;
@@ -85927,7 +86010,7 @@ function completeInstall() {
85927
86010
  const r = installEngine(MINE2, { say });
85928
86011
  if (!r.ok) say(`the update did not finish: ${r.error} \xB7 ${npmFix(MINE2)}`);
85929
86012
  }
85930
- var ENGINE_COMMANDS = /* @__PURE__ */ new Set(["run", "login", "logout", "whoami", "model", "key", "sessions", "show", "sync", "skill", "ps", "stop", "hooks", "engine"]);
86013
+ var ENGINE_COMMANDS = /* @__PURE__ */ new Set(["run", "login", "logout", "whoami", "model", "key", "sessions", "show", "sync", "skill", "persona", "ps", "stop", "hooks", "engine"]);
85931
86014
  var argv0 = process.argv.slice(2);
85932
86015
  if (argv0[0] === "--version" || argv0[0] === "-V") {
85933
86016
  process.stdout.write(`hum ${MINE2}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaphi-ai/hum",
3
- "version": "0.1.33",
3
+ "version": "0.1.35",
4
4
  "description": "Hum (हम): a self-improving coding agent for your terminal.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",