@litfamily/lithermes 1.0.14 → 1.0.16

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/README.md CHANGED
@@ -1,16 +1,16 @@
1
- <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitHermes robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitHermes robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
2
2
 
3
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/ascii-readme.svg" width="480" alt="LIT ASCII B mark" /></p>
3
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/ascii-readme.svg" width="480" alt="LIT ASCII B mark" /></p>
4
4
 
5
5
  <p align="center">
6
- <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/badge-version.svg" alt="1.0.14" /></a>
7
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/badge-license.svg" alt="MIT license" /></a>
6
+ <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/badge-version.svg" alt="1.0.16" /></a>
7
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/badge-license.svg" alt="MIT license" /></a>
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/lucide-book-open.svg" width="16" alt="" /> Guide</a> &nbsp;
12
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition film</a> &nbsp;
13
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
11
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/lucide-book-open.svg" width="16" alt="" /> Guide</a> &nbsp;
12
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition film</a> &nbsp;
13
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
14
14
  </p>
15
15
 
16
16
  # LitHermes
@@ -19,7 +19,7 @@
19
19
 
20
20
  A plugin for **Hermes Agent**. Add `lit` to a request, and Hermes plans the task, does it, checks it, and leaves a note the next session can pick up.
21
21
 
22
- **[Full guide and skills gallery on GitHub](https://github.com/wjgoarxiv/lithermes#readme)** · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/README_Ko-KR.md)
22
+ **[Full guide and skills gallery on GitHub](https://github.com/wjgoarxiv/lithermes#readme)** · [한국어](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/README_Ko-KR.md)
23
23
 
24
24
  ## Install
25
25
 
package/README_Ko-KR.md CHANGED
@@ -1,16 +1,16 @@
1
- <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitHermes 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 다섯 로봇 패널이 차례로 켜지고, LitHermes 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
2
2
 
3
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/ascii-readme.svg" width="480" alt="LIT ASCII B 마크" /></p>
3
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/ascii-readme.svg" width="480" alt="LIT ASCII B 마크" /></p>
4
4
 
5
5
  <p align="center">
6
- <a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/badge-version.svg" alt="1.0.14" /></a>
7
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/badge-license.svg" alt="MIT license" /></a>
6
+ <a href="#설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/badge-version.svg" alt="1.0.16" /></a>
7
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/badge-license.svg" alt="MIT license" /></a>
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.ko.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/lucide-book-open.svg" width="16" alt="" /> 안내</a> &nbsp;
12
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition 영상</a> &nbsp;
13
- <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
11
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/docs/guide.ko.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/lucide-book-open.svg" width="16" alt="" /> 안내</a> &nbsp;
12
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition 영상</a> &nbsp;
13
+ <a href="https://github.com/wjgoarxiv/lithermes/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
14
14
  </p>
15
15
 
16
16
  # LitHermes
@@ -19,7 +19,7 @@
19
19
 
20
20
  **Hermes Agent**용 플러그인입니다. 요청에 `lit`을 붙이면 Hermes가 작업을 계획하고, 실행하고, 확인한 뒤 다음 세션이 이어받을 기록을 남깁니다.
21
21
 
22
- **[전체 안내와 스킬 갤러리는 GitHub에서](https://github.com/wjgoarxiv/lithermes/blob/main/README_Ko-KR.md)** · [English](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.14/README.md)
22
+ **[전체 안내와 스킬 갤러리는 GitHub에서](https://github.com/wjgoarxiv/lithermes/blob/main/README_Ko-KR.md)** · [English](https://cdn.jsdelivr.net/npm/@litfamily/lithermes@1.0.16/README.md)
23
23
 
24
24
  ## 설치
25
25
 
@@ -254,10 +254,12 @@ CLI/plugin name, not the npm package name.
254
254
  - New installs default to the lead route `gpt-6-astra` / `xhigh` for planning,
255
255
  review, and other lead work, and to `gpt-6-luna` / `max` for helpers and
256
256
  ordinary workers on the global child route. Model diagnostics report these
257
- routes without exposing credential fields. The coding-lead alternative is `gpt-6-sol` /
258
- `xhigh`. Astra and Sol each support `low`, `medium`, `high`, `xhigh`, `max`,
259
- and `ultra`; Sol defaults to `xhigh` when selected as lead. Luna supports
260
- `low`, `medium`, `high`, `xhigh`, and `max`, with no `ultra`. Existing GPT-5.6
257
+ routes without exposing credential fields. The coding-lead alternative is `gpt-6.1-sol` /
258
+ `xhigh`. Astra and `gpt-6.1-sol` each support `low`, `medium`, `high`, `xhigh`,
259
+ `max`, and `ultra`; Sol defaults to `xhigh` when selected as lead. The previous
260
+ generation `gpt-6-sol` stays selectable with the same efforts, so existing
261
+ configs keep working. Luna supports `low`, `medium`, `high`, `xhigh`, and
262
+ `max`, with no `ultra`. Existing GPT-5.6
261
263
  choices remain selectable within their listed bounds: `gpt-5.6-sol` at
262
264
  `high` or `xhigh`, `gpt-5.6-terra` at `high`, `xhigh`, or `max`, and `gpt-5.6-luna`
263
265
  at `high` or `max`; general `gpt-5.6` offers `high`. The live model catalog
@@ -329,6 +329,7 @@ def _auto_handoff_block(kwargs: dict[str, Any]) -> str:
329
329
  user_message=kwargs.get("user_message"),
330
330
  conversation_history=kwargs.get("conversation_history"),
331
331
  platform=kwargs.get("platform"),
332
+ parent_session_id=kwargs.get("parent_session_id"),
332
333
  )
333
334
  except Exception: # noqa: BLE001 - advisory only
334
335
  return ""
@@ -19,6 +19,12 @@ How it works on this host, step by step:
19
19
  compaction summary in the history and loads a bounded digest of the handoff,
20
20
  but only if the file carries this session's id and was written after the
21
21
  directive. Anything else is refused.
22
+ 4. Hermes moves a compacted conversation to a new session id. When a turn
23
+ arrives under an id this process has no waiting state for, carries a new
24
+ compaction summary, and exactly one session with the same platform and
25
+ profile is waiting for its reload, that state moves to the new id (a
26
+ ``parent_session_id`` that names a waiting session settles it directly).
27
+ With two or more waiting sessions and no named parent, nothing is adopted.
22
28
 
23
29
  The feature fires once per crossing of the percent, never inside a tool call,
24
30
  and never for delegate children. State is kept in memory per session; only the
@@ -81,6 +87,7 @@ _NOFOLLOW = getattr(os, "O_NOFOLLOW", 0)
81
87
  _PERCENT = re.compile(r"[0-9]{1,2}")
82
88
  _BARE_HANDOFF = re.compile(r"^\s*handoff\s*$", re.IGNORECASE)
83
89
  _HEADING = re.compile(r"^#{1,4}\s*(.+?)\s*$")
90
+ _MARKDOWN_DECORATION = re.compile(r"[*_`]|<!--|-->")
84
91
  _WANTED_SECTIONS = (("current state", "Current State"), ("next steps", "Next Steps"))
85
92
  _LOCK = threading.RLock()
86
93
  _SESSIONS: dict[str, dict[str, Any]] = {}
@@ -497,7 +504,7 @@ def _state(session_id: str) -> dict[str, Any]:
497
504
  state = _SESSIONS[session_id] = {
498
505
  "percent": None, "used": None, "window": None,
499
506
  "above": False, "pending": False, "awaiting": False, "dropped": False,
500
- "nonce": "", "fired_at": 0.0, "cwd": "", "summary": "",
507
+ "nonce": "", "fired_at": 0.0, "cwd": "", "summary": "", "platform": "", "home": "",
501
508
  }
502
509
  return state
503
510
 
@@ -576,8 +583,12 @@ def pre_llm_call(**kwargs: Any) -> str:
576
583
  if not session_id or is_delegate_child_platform(str(kwargs.get("platform") or "")):
577
584
  return ""
578
585
  history = kwargs.get("conversation_history")
586
+ platform = str(kwargs.get("platform") or "")
579
587
  with _LOCK:
580
588
  state = _SESSIONS.get(session_id)
589
+ if state is None or _is_fresh(state):
590
+ adopted = _adopt_rotated(session_id, str(kwargs.get("parent_session_id") or ""), platform, history)
591
+ state = adopted or state
581
592
  if state is None:
582
593
  return ""
583
594
  _LAST_SESSION[0] = session_id
@@ -591,12 +602,56 @@ def pre_llm_call(**kwargs: Any) -> str:
591
602
  return ""
592
603
  if not state["pending"] or _explicit_handoff_turn(str(kwargs.get("user_message") or "")):
593
604
  return ""
605
+ if state["percent"] is None:
606
+ return ""
607
+ nonce = secrets.token_hex(6)
608
+ block = _directive_block({**state, "nonce": nonce}, setting.percent)
594
609
  state["pending"], state["awaiting"], state["dropped"] = False, True, False
595
- state["nonce"] = secrets.token_hex(6)
610
+ state["nonce"] = nonce
596
611
  state["fired_at"] = time.time()
597
612
  state["cwd"] = os.getcwd()
598
613
  state["summary"] = _summary_fingerprint(history)
599
- return _directive_block(state, setting.percent)
614
+ state["platform"], state["home"] = platform, str(get_hermes_home())
615
+ return block
616
+
617
+
618
+ def _is_fresh(state: Mapping[str, Any]) -> bool:
619
+ """A state that has only read usage: never crossed, never fired."""
620
+ return not (state["awaiting"] or state["pending"] or state["nonce"])
621
+
622
+
623
+ def _adopt_rotated(
624
+ session_id: str, parent_session_id: str, platform: str, history: Any
625
+ ) -> dict[str, Any] | None:
626
+ """Move a waiting state to the new id Hermes gave the conversation when it compacted.
627
+
628
+ Returns the moved state, or None when nothing is adopted. Caller holds the lock.
629
+ """
630
+ if not any(value["awaiting"] for value in _SESSIONS.values()):
631
+ return None
632
+ summary = _summary_fingerprint(history)
633
+ if not summary:
634
+ return None
635
+ home = str(get_hermes_home())
636
+ waiting = {
637
+ key: value for key, value in _SESSIONS.items()
638
+ if key != session_id and value["awaiting"] and value["platform"] == platform
639
+ and value["home"] == home and summary != value["summary"]
640
+ }
641
+ if parent_session_id in waiting:
642
+ old_id = parent_session_id
643
+ elif len(waiting) == 1:
644
+ old_id = next(iter(waiting))
645
+ else:
646
+ return None
647
+ state = waiting[old_id]
648
+ fresh = _SESSIONS.pop(session_id, None)
649
+ if fresh is not None:
650
+ for name in ("percent", "used", "window", "above"):
651
+ state[name] = fresh[name]
652
+ del _SESSIONS[old_id]
653
+ _SESSIONS[session_id] = state
654
+ return state
600
655
 
601
656
 
602
657
  def _directive_block(state: Mapping[str, Any], percent: int) -> str:
@@ -612,6 +667,14 @@ def _directive_block(state: Mapping[str, Any], percent: int) -> str:
612
667
  ])
613
668
 
614
669
 
670
+ def _marker_on_line(line: str, nonce: str) -> bool:
671
+ """True when the line carries this session's marker, however Markdown dresses it (bullet, quote,
672
+ bold, italics, backticks, comment, a leading label). The id must match exactly and end on a
673
+ non-hex character."""
674
+ plain = _MARKDOWN_DECORATION.sub("", line)
675
+ return re.search(rf"(?i:auto-handoff-id)[ \t]*:[ \t]*{re.escape(nonce)}(?![0-9a-f])", plain) is not None
676
+
677
+
615
678
  def _find_handoff(state: Mapping[str, Any]) -> tuple[str, float, str] | None:
616
679
  found: tuple[str, float, str] | None = None
617
680
  for relative in HANDOFF_CANDIDATES:
@@ -627,7 +690,7 @@ def _find_handoff(state: Mapping[str, Any]) -> tuple[str, float, str] | None:
627
690
  text = handle.read(MAX_HANDOFF_READ_BYTES).decode("utf-8", "replace")
628
691
  except OSError:
629
692
  continue
630
- if re.search(rf"auto-handoff-id:[ \t]*{re.escape(state['nonce'])}(?![0-9a-f])", text) is None:
693
+ if not any(_marker_on_line(line, state["nonce"]) for line in text.splitlines()):
631
694
  continue
632
695
  if found is None or info.st_mtime > found[1]:
633
696
  found = (relative, info.st_mtime, text)
@@ -644,7 +707,7 @@ def _digest(text: str, nonce: str) -> str:
644
707
  title = heading.group(1).lower()
645
708
  current = next((label for key, label in _WANTED_SECTIONS if key in title), "")
646
709
  continue
647
- if nonce in line or not line.strip():
710
+ if nonce in line or _marker_on_line(line, nonce) or not line.strip():
648
711
  continue
649
712
  if len(body) < MAX_DIGEST_LINES:
650
713
  body.append(line.strip()[:MAX_DIGEST_LINE_CHARS])
@@ -79,7 +79,8 @@ _RUNTIME_STEM = "".join(("co", "dex"))
79
79
  _OPENAI_PROVIDER = f"openai-{_RUNTIME_STEM}"
80
80
  _RESPONSES_MODE = f"{_RUNTIME_STEM}_responses"
81
81
  _ASTRA_MODEL = "gpt-6-astra"
82
- _SOL_MODEL = "gpt-6-sol"
82
+ _SOL_MODEL = "gpt-6.1-sol"
83
+ _PREVIOUS_SOL_MODEL = "gpt-6-sol"
83
84
  _LUNA_MODEL = "gpt-6-luna"
84
85
  _LEGACY_SOL_MODEL = "gpt-5.6-sol"
85
86
  _TERRA_MODEL = "gpt-5.6-terra"
@@ -94,6 +95,7 @@ _ASTRA_EFFORTS = _GPT6_LEAD_EFFORTS
94
95
  _OPENAI_CATALOG_EFFORTS = {
95
96
  _ASTRA_MODEL: _ASTRA_EFFORTS,
96
97
  _SOL_MODEL: _GPT6_LEAD_EFFORTS,
98
+ _PREVIOUS_SOL_MODEL: _GPT6_LEAD_EFFORTS,
97
99
  _LUNA_MODEL: _GPT6_LUNA_EFFORTS,
98
100
  _LEGACY_SOL_MODEL: _LEGACY_SOL_EFFORTS,
99
101
  _TERRA_MODEL: _TERRA_EFFORTS,
@@ -357,7 +359,7 @@ def _parse_capabilities(host_version: str) -> CapabilityResult:
357
359
  astra = (astra_parent or astra_child) and cataloged_parent and cataloged_child
358
360
  sol_lead = (
359
361
  provider == _OPENAI_PROVIDER
360
- and model in (_SOL_MODEL, _LEGACY_SOL_MODEL)
362
+ and model in (_SOL_MODEL, _PREVIOUS_SOL_MODEL, _LEGACY_SOL_MODEL)
361
363
  and _cataloged_route(model, effort)
362
364
  and child_model in _LUNA_MODELS
363
365
  and _cataloged_route(child_model, child_effort)
@@ -1,7 +1,7 @@
1
1
  {
2
- "syncedAt": "2026-09-30T09:04:54.689Z",
2
+ "syncedAt": "2026-10-01T12:46:03.128Z",
3
3
  "source": "bundled-payload",
4
- "sourceHash": "0c8bc244aece11b11cfa6b99809f218689f5d445b98e579b467910ed84897ec6",
4
+ "sourceHash": "e01bfaa1dbee52cc21eceee9f7c8095f7eaa94685e92eadaaeed08998fbd9e43",
5
5
  "files": [
6
6
  {
7
7
  "path": "NOTICE.md",
@@ -9,15 +9,15 @@
9
9
  },
10
10
  {
11
11
  "path": "README.md",
12
- "sha256": "23af46fe9078058d97f14fcde0aacc7b615575ec38b75cfee0d959649eb7b3d2"
12
+ "sha256": "234ed5a80d74dec9953f5168b85f666de656b3511c23a74e26194748a4f3b766"
13
13
  },
14
14
  {
15
15
  "path": "__init__.py",
16
- "sha256": "a3393c5776bc7557345de5623e58cb966c0154b3972111907a5ad9954165a0d9"
16
+ "sha256": "76cf72655600b82544e9047fab1f5f4030927803c0cfbc08fca311204f37d32c"
17
17
  },
18
18
  {
19
19
  "path": "auto_handoff.py",
20
- "sha256": "4a34c6b1ee153a405943a87c74fc09832da3b9d5ca4b9b50acf32cd0f2a4fe19"
20
+ "sha256": "452a027f6f8cc800ff723a137ffec3e6b4a582b464519e2e1556c8d141a20242"
21
21
  },
22
22
  {
23
23
  "path": "auto_update.py",
@@ -89,7 +89,7 @@
89
89
  },
90
90
  {
91
91
  "path": "diagnostics.py",
92
- "sha256": "4c70cdfc9a3bb70cbf319058592316110cd8a6d1b52d5a11a28c16e29cb4f645"
92
+ "sha256": "bd797eadf291ec9cd6c02926595305532e235e21794e4467e157c03b0311fe54"
93
93
  },
94
94
  {
95
95
  "path": "handoff.py",
@@ -181,7 +181,7 @@
181
181
  },
182
182
  {
183
183
  "path": "plugin.yaml",
184
- "sha256": "86bdae4be0a711f4ed4c373c9a38d63a7d32f5d0d7b35dac1c5ed828f5611d6b"
184
+ "sha256": "2af459b0dabd0b5800fbc25ccf14b20e56295f9fc6f370f170ab5f0b879c00d9"
185
185
  },
186
186
  {
187
187
  "path": "provider_metrics.py",
@@ -1285,7 +1285,7 @@
1285
1285
  },
1286
1286
  {
1287
1287
  "path": "skills/frontend-ui-ux/references/complete-contract.md",
1288
- "sha256": "c716c333d0c8304769ea8504f4231072ba26525312c306efddc267ce546c2af0"
1288
+ "sha256": "475d183a1a31a625b7e176515242319b3fb3ee45455ee610155d97d5a49aa744"
1289
1289
  },
1290
1290
  {
1291
1291
  "path": "skills/frontend-ui-ux/references/composition.md",
@@ -4153,7 +4153,7 @@
4153
4153
  },
4154
4154
  {
4155
4155
  "path": "skills/visual-qa/references/complete-contract.md",
4156
- "sha256": "813f97453109dffa89aca3602db39ae7d69fb874cf867e2dfb002612cbf730b4"
4156
+ "sha256": "e9d0a6972ffbb089b644dc1d4737427bd8569b472b3508b26c079607ebdd293b"
4157
4157
  },
4158
4158
  {
4159
4159
  "path": "skills/visual-qa/schemas/evidence-manifest-v1alpha1.schema.json",
@@ -1,5 +1,5 @@
1
1
  name: lithermes
2
- version: 1.0.14
2
+ version: 1.0.16
3
3
  description: "Hermes-native workflow toolkit: litgoal durable runtime, 5-lane review orchestrator, Litwork commands, skills, and prompt steering."
4
4
  author: "LitHermes contributors"
5
5
  kind: standalone
@@ -445,7 +445,7 @@ isolated Hermes home. Use `--hermes-home`; never `--home`.
445
445
 
446
446
  ```text
447
447
  $ node packages/lithermes-installer/bin/lithermes.js install --yes --offline --no-hud --hermes-home "$ISOLATED"
448
- Installed LitHermes 1.0.14
448
+ Installed LitHermes 1.0.16
449
449
  plugin: $ISOLATED/plugins/lithermes
450
450
  model config: updated
451
451
 
@@ -462,7 +462,7 @@ installed payload: PASS
462
462
  enabled config: PASS
463
463
 
464
464
  $ hermes lithermes doctor
465
- [OK] plugin.yaml readable (version 1.0.14)
465
+ [OK] plugin.yaml readable (version 1.0.16)
466
466
  [OK] skills bundled: 36
467
467
  [OK] litgoal durable runtime importable
468
468
  ```
@@ -485,7 +485,7 @@ isolated Hermes home. Use `--hermes-home`; never `--home`.
485
485
 
486
486
  ```text
487
487
  $ node packages/lithermes-installer/bin/lithermes.js install --yes --offline --no-hud --hermes-home "$ISOLATED"
488
- Installed LitHermes 1.0.14
488
+ Installed LitHermes 1.0.16
489
489
  plugin: $ISOLATED/plugins/lithermes
490
490
  model config: updated
491
491
 
@@ -502,7 +502,7 @@ installed payload: PASS
502
502
  enabled config: PASS
503
503
 
504
504
  $ hermes lithermes doctor
505
- [OK] plugin.yaml readable (version 1.0.14)
505
+ [OK] plugin.yaml readable (version 1.0.16)
506
506
  [OK] skills bundled: 36
507
507
  [OK] litgoal durable runtime importable
508
508
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litfamily/lithermes",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "npx/bunx installer for the LitHermes Hermes plugin",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.14"><title>release: 1.0.14</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="390" transform="scale(.1)">release</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.14</text></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.16"><title>release: 1.0.16</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="390" transform="scale(.1)">release</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.16</text></g></svg>
@@ -3,7 +3,8 @@ const GPT6_LEAD_EFFORTS = new Set(["low", "medium", "high", "xhigh", "max", "ult
3
3
  const ASTRA_EFFORTS = GPT6_LEAD_EFFORTS;
4
4
  const PARENT_MODEL = ASTRA_MODEL;
5
5
  const PARENT_EFFORT = "xhigh";
6
- const SOL_MODEL = "gpt-6-sol";
6
+ const SOL_MODEL = "gpt-6.1-sol";
7
+ const PREVIOUS_SOL_MODEL = "gpt-6-sol";
7
8
  const CHILD_MODEL = "gpt-6-luna";
8
9
  const LEGACY_SOL_MODEL = "gpt-5.6-sol";
9
10
  const LEGACY_CHILD_MODEL = "gpt-5.6-luna";
@@ -18,6 +19,7 @@ const LEGACY_SOL_EFFORTS = new Set(["high", "xhigh"]);
18
19
  const MODEL_EFFORTS = new Map([
19
20
  [ASTRA_MODEL, GPT6_LEAD_EFFORTS],
20
21
  [SOL_MODEL, GPT6_LEAD_EFFORTS],
22
+ [PREVIOUS_SOL_MODEL, GPT6_LEAD_EFFORTS],
21
23
  [CHILD_MODEL, GPT6_LUNA_EFFORTS],
22
24
  [LEGACY_SOL_MODEL, LEGACY_SOL_EFFORTS],
23
25
  [LEGACY_CHILD_MODEL, LEGACY_LUNA_EFFORTS],
@@ -51,6 +53,11 @@ const ROUTE_CATALOG = {
51
53
  model: SOL_MODEL,
52
54
  note: effort === PARENT_EFFORT ? "coding lead alternative" : "Sol Responses effort",
53
55
  })),
56
+ ...["low", "medium", "high", "xhigh", "max", "ultra"].map((effort) => ({
57
+ effort,
58
+ model: PREVIOUS_SOL_MODEL,
59
+ note: "previous-generation Sol lead route",
60
+ })),
54
61
  ...["low", "medium", "high", "xhigh", "max"].map((effort) => ({
55
62
  effort,
56
63
  model: CHILD_MODEL,
@@ -403,6 +410,7 @@ module.exports = {
403
410
  MANAGED_PROVIDER_MODELS,
404
411
  MODEL_IDS,
405
412
  OPENAI_PROVIDER_ID,
413
+ PREVIOUS_SOL_MODEL,
406
414
  SOL_MODEL,
407
415
  PROVIDER_IDS,
408
416
  ROUTE_CATALOG,