charness 3.1.0 → 3.2.0

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 (138) hide show
  1. package/.env.example +8 -7
  2. package/DEVELOPMENT.md +12 -6
  3. package/MIGRATION_1_TO_2.md +1 -1
  4. package/MIGRATION_RENAME_TO_CHARNESS.md +133 -0
  5. package/README.md +75 -581
  6. package/SETUP.md +539 -0
  7. package/dist/adapters/claudeCliAdapter.d.ts +1 -1
  8. package/dist/adapters/claudeCliAdapter.js +1 -1
  9. package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
  10. package/dist/adapters/claudeJsonStreamAdapter.js +2 -1
  11. package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
  12. package/dist/adapters/openCodeAdapter.js +1 -1
  13. package/dist/bot.d.ts.map +1 -1
  14. package/dist/bot.js +7 -6
  15. package/dist/bot.js.map +1 -1
  16. package/dist/cli/bot.d.ts +4 -2
  17. package/dist/cli/bot.d.ts.map +1 -1
  18. package/dist/cli/bot.js +11 -3
  19. package/dist/cli/bot.js.map +1 -1
  20. package/dist/cli/botEntry.js +3 -1
  21. package/dist/cli/botEntry.js.map +1 -1
  22. package/dist/cli/claudeProfiles.d.ts +3 -3
  23. package/dist/cli/claudeProfiles.js +4 -4
  24. package/dist/cli/claudeProfiles.js.map +1 -1
  25. package/dist/cli/envLoader.d.ts +6 -5
  26. package/dist/cli/envLoader.d.ts.map +1 -1
  27. package/dist/cli/envLoader.js +8 -27
  28. package/dist/cli/envLoader.js.map +1 -1
  29. package/dist/cli/hot.d.ts +2 -2
  30. package/dist/cli/hot.d.ts.map +1 -1
  31. package/dist/cli/hot.js +26 -16
  32. package/dist/cli/hot.js.map +1 -1
  33. package/dist/cli.js +12 -12
  34. package/dist/cli.js.map +1 -1
  35. package/dist/connectors/jira/adf.d.ts +21 -0
  36. package/dist/connectors/jira/adf.d.ts.map +1 -1
  37. package/dist/connectors/jira/adf.js +39 -0
  38. package/dist/connectors/jira/adf.js.map +1 -1
  39. package/dist/connectors/jira/answerSink.d.ts +20 -3
  40. package/dist/connectors/jira/answerSink.d.ts.map +1 -1
  41. package/dist/connectors/jira/answerSink.js +126 -13
  42. package/dist/connectors/jira/answerSink.js.map +1 -1
  43. package/dist/connectors/jira/client.d.ts +4 -0
  44. package/dist/connectors/jira/client.d.ts.map +1 -1
  45. package/dist/connectors/jira/client.js +3 -0
  46. package/dist/connectors/jira/client.js.map +1 -1
  47. package/dist/connectors/jira/config.d.ts +10 -1
  48. package/dist/connectors/jira/config.d.ts.map +1 -1
  49. package/dist/connectors/jira/config.js +11 -2
  50. package/dist/connectors/jira/config.js.map +1 -1
  51. package/dist/connectors/jira/connector.d.ts +7 -1
  52. package/dist/connectors/jira/connector.d.ts.map +1 -1
  53. package/dist/connectors/jira/connector.js +23 -4
  54. package/dist/connectors/jira/connector.js.map +1 -1
  55. package/dist/connectors/jira/contextLedger.d.ts +6 -0
  56. package/dist/connectors/jira/contextLedger.d.ts.map +1 -1
  57. package/dist/connectors/jira/contextLedger.js +16 -0
  58. package/dist/connectors/jira/contextLedger.js.map +1 -1
  59. package/dist/connectors/jira/contextPreamble.d.ts.map +1 -1
  60. package/dist/connectors/jira/contextPreamble.js +6 -3
  61. package/dist/connectors/jira/contextPreamble.js.map +1 -1
  62. package/dist/connectors/jira/inbound.d.ts +60 -7
  63. package/dist/connectors/jira/inbound.d.ts.map +1 -1
  64. package/dist/connectors/jira/inbound.js +169 -16
  65. package/dist/connectors/jira/inbound.js.map +1 -1
  66. package/dist/connectors/jira/issueBlocks.d.ts +6 -1
  67. package/dist/connectors/jira/issueBlocks.d.ts.map +1 -1
  68. package/dist/connectors/jira/issueBlocks.js +5 -1
  69. package/dist/connectors/jira/issueBlocks.js.map +1 -1
  70. package/dist/connectors/jira/prompt.d.ts +2 -0
  71. package/dist/connectors/jira/prompt.d.ts.map +1 -1
  72. package/dist/connectors/jira/prompt.js +16 -0
  73. package/dist/connectors/jira/prompt.js.map +1 -1
  74. package/dist/connectors/jira/trigger.d.ts +12 -3
  75. package/dist/connectors/jira/trigger.d.ts.map +1 -1
  76. package/dist/connectors/jira/trigger.js +8 -1
  77. package/dist/connectors/jira/trigger.js.map +1 -1
  78. package/dist/connectors/jira/triggerLog.d.ts +10 -3
  79. package/dist/connectors/jira/triggerLog.d.ts.map +1 -1
  80. package/dist/connectors/jira/triggerLog.js +18 -2
  81. package/dist/connectors/jira/triggerLog.js.map +1 -1
  82. package/dist/index.js +1 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/installManager.d.ts +16 -2
  85. package/dist/installManager.d.ts.map +1 -1
  86. package/dist/installManager.js +42 -12
  87. package/dist/installManager.js.map +1 -1
  88. package/dist/instanceLock.d.ts.map +1 -1
  89. package/dist/instanceLock.js +10 -8
  90. package/dist/instanceLock.js.map +1 -1
  91. package/dist/legacyMigration.d.ts +69 -0
  92. package/dist/legacyMigration.d.ts.map +1 -0
  93. package/dist/legacyMigration.js +338 -0
  94. package/dist/legacyMigration.js.map +1 -0
  95. package/dist/legacyNames.d.ts +107 -0
  96. package/dist/legacyNames.d.ts.map +1 -0
  97. package/dist/legacyNames.js +230 -0
  98. package/dist/legacyNames.js.map +1 -0
  99. package/dist/platform/answerSink.d.ts +5 -0
  100. package/dist/platform/answerSink.d.ts.map +1 -1
  101. package/dist/platform/answerSink.js.map +1 -1
  102. package/dist/requests/answerRequest.d.ts +2 -0
  103. package/dist/requests/answerRequest.d.ts.map +1 -1
  104. package/dist/requests/answerRequest.js +3 -1
  105. package/dist/requests/answerRequest.js.map +1 -1
  106. package/dist/requests/answerStyle.d.ts +11 -0
  107. package/dist/requests/answerStyle.d.ts.map +1 -0
  108. package/dist/requests/answerStyle.js +14 -0
  109. package/dist/requests/answerStyle.js.map +1 -0
  110. package/dist/requests/answerTail.d.ts.map +1 -1
  111. package/dist/requests/answerTail.js +2 -0
  112. package/dist/requests/answerTail.js.map +1 -1
  113. package/dist/requests/requestHeader.d.ts.map +1 -1
  114. package/dist/requests/requestHeader.js +3 -0
  115. package/dist/requests/requestHeader.js.map +1 -1
  116. package/dist/requests/requestLedger.js +1 -1
  117. package/dist/requests/requestLedger.js.map +1 -1
  118. package/dist/requests/types.d.ts +3 -1
  119. package/dist/requests/types.d.ts.map +1 -1
  120. package/dist/scheduler/mcpSurface.d.ts +9 -1
  121. package/dist/scheduler/mcpSurface.d.ts.map +1 -1
  122. package/dist/scheduler/mcpSurface.js +45 -12
  123. package/dist/scheduler/mcpSurface.js.map +1 -1
  124. package/dist/state.d.ts +3 -1
  125. package/dist/state.d.ts.map +1 -1
  126. package/dist/state.js +5 -2
  127. package/dist/state.js.map +1 -1
  128. package/dist/utils/claudeProfiles.d.ts +7 -0
  129. package/dist/utils/claudeProfiles.d.ts.map +1 -1
  130. package/dist/utils/claudeProfiles.js +19 -0
  131. package/dist/utils/claudeProfiles.js.map +1 -1
  132. package/dist/utils/openCodeCompactPlugin.d.ts +11 -3
  133. package/dist/utils/openCodeCompactPlugin.d.ts.map +1 -1
  134. package/dist/utils/openCodeCompactPlugin.js +37 -5
  135. package/dist/utils/openCodeCompactPlugin.js.map +1 -1
  136. package/examples/.env.example +7 -7
  137. package/examples/docker-compose.yml +15 -14
  138. package/package.json +3 -1
package/.env.example CHANGED
@@ -1,16 +1,16 @@
1
1
  # Charness (formerly TelegramCode) 2.0 — forum-supergroup mode.
2
2
  #
3
- # Copy this file to `~/.config/telegramcode/.env`, fill TELEGRAM_BOT_TOKEN,
3
+ # Copy this file to `~/.config/charness/.env`, fill TELEGRAM_BOT_TOKEN,
4
4
  # then launch from the parent folder containing your projects:
5
- # cd ~/projects && telegramcode
5
+ # cd ~/projects && charness
6
6
  # For docker compose use `examples/docker-compose.yml` and the per-instance
7
7
  # prefix scheme (`PET_*` / `WORK_*`).
8
8
  #
9
- # The `telegramcode` wrapper loads env from two locations:
10
- # 1. ~/.config/telegramcode/.env (base — fill in once, used everywhere)
9
+ # The `charness` wrapper loads env from two locations:
10
+ # 1. ~/.config/charness/.env (base — fill in once, used everywhere)
11
11
  # 2. $PWD/.env (override — per-project tweaks)
12
12
  # Start the bot from the parent folder containing your projects:
13
- # cd ~/projects && telegramcode
13
+ # cd ~/projects && charness
14
14
  # That $PWD becomes the work root. Do not set WORK_ROOT for normal use.
15
15
 
16
16
  # ── Required before launch ──────────────────────────────────────────────────
@@ -46,10 +46,11 @@ ALLOWED_GROUP_ID=
46
46
  # OWNER_USER_ID=
47
47
 
48
48
  # Where the bot keeps state.json, mcp.json, tmp/ and logs. Default:
49
- # ~/.telegramCode. **Required to be distinct** when running two bots on the
49
+ # ~/.charness (an existing ~/.telegramCode is kept while ~/.charness does not
50
+ # exist). **Required to be distinct** when running two bots on the
50
51
  # same host under the same linux user (otherwise they corrupt each other's
51
52
  # state.json). See plan §10.7.
52
- # DATA_DIR=/home/user/.telegramCode/mybot
53
+ # DATA_DIR=/home/user/.charness-mybot
53
54
 
54
55
  # Voice transcription. Recommended: without GROQ_API_KEY, voice messages are
55
56
  # not transcribed unless you intentionally configure the OpenAI fallback below.
package/DEVELOPMENT.md CHANGED
@@ -7,8 +7,8 @@ code (`src/<module>/README.md`).
7
7
 
8
8
  ## Architecture
9
9
 
10
- The per-topic folder layout is in the README under
11
- [Required files structure](README.md#required-files-structure).
10
+ The per-topic folder layout is in [SETUP.md](SETUP.md) under
11
+ [Required files structure](SETUP.md#required-files-structure).
12
12
 
13
13
  Routing key is `(chatId, threadId)` everywhere. Per-thread state lives in
14
14
  `${DATA_DIR}/state.json` (atomic writes with `fsync`, archived on
@@ -77,6 +77,7 @@ Each adapter implements `AgentAdapter` from `src/types.ts`:
77
77
  ## Local development
78
78
 
79
79
  ```bash
80
+ git clone https://github.com/olosegres/charness && cd charness
80
81
  yarn install
81
82
  yarn dev # tsx watch (fast dev — TS errors crash the process)
82
83
  yarn typecheck # strict tsc over all of src/, test code included
@@ -87,12 +88,17 @@ yarn test # test:unit, then test:flows (node test runner + tsx); build
87
88
  yarn test:unit # every file but the flows; each file must finish in 2 min
88
89
  yarn test:flows # the `*E2e.test.ts` flows; each file must finish in 20 min
89
90
  yarn hot # hot-reload mode: tsc -w + nodemon on dist/ (also
90
- # `telegramcode hot` from anywhere) — a broken edit can't
91
+ # `charness hot` from anywhere) — a broken edit can't
91
92
  # take the bot down; OpenCode generations stay outside the
92
93
  # worker tree, so agent turns survive worker reloads
93
94
  # (Linux/macOS; Windows hot mode is intentionally refused)
94
95
  ```
95
96
 
97
+ To run your checkout as the global `charness` command instead of the npm package, `yarn install-link`
98
+ (= `yarn install && yarn build && npm link`) symlinks the command to this folder, so a later `yarn build` is picked up
99
+ without re-installing; `npm install -g .` installs a copy instead. Configuration and launch are as in
100
+ [SETUP.md](SETUP.md).
101
+
96
102
  Node applies `--test-timeout` to a whole test FILE (a `describe`'s own `timeout` cannot extend it), so a file that
97
103
  hangs or leaves a process alive fails by name when its limit passes, instead of hanging the run. A long-running
98
104
  flow file must be named `*E2e.test.ts` to get the flows' limit; `live/*Live.test.ts` is run directly (CLAUDE.md).
@@ -104,7 +110,7 @@ The Docker dev loop (never `docker compose restart` — it ignores
104
110
  `depends_on`):
105
111
 
106
112
  ```bash
107
- docker compose down telegramcode && docker compose up -d telegramcode # examples/docker-compose.yml
108
- docker compose logs -f telegramcode # tail logs
109
- docker exec telegramcode-main telegramcode-restart-bot # restart only the bot; agents keep running
113
+ docker compose down charness && docker compose up -d charness # examples/docker-compose.yml
114
+ docker compose logs -f charness # tail logs
115
+ docker exec charness-main charness-restart-bot # restart only the bot; agents keep running
110
116
  ```
@@ -4,7 +4,7 @@ The 1.x "one bot = one private chat = one folder" mode is **removed**.
4
4
  There is no in-place upgrade; the steps are:
5
5
 
6
6
  1. Stop the old bot.
7
- 2. Create a forum supergroup, add the bot, follow [Quick Start §3](README.md#3-set-up-a-group-optional-or-dm).
7
+ 2. Create a forum supergroup, add the bot, follow [Telegram setup, step 2](SETUP.md#2-set-up-a-group-optional-or-dm).
8
8
  3. Remove the old `WORK_DIR` env and launch from the projects parent:
9
9
  `cd /home/user/src && telegramcode`.
10
10
  4. Leave `ALLOWED_GROUP_ID` empty to auto-pair on first contact (or set
@@ -0,0 +1,133 @@
1
+ # Migrating from the TelegramCode names to Charness
2
+
3
+ The product, the package and the command became **Charness** / `charness` in 3.0.0. This change renames what
4
+ was left under the old name: the config and data dirs, the environment variables, the Docker names and a few
5
+ internal identifiers. **Nothing breaks on update**: every old name is still read as a fallback, and each fallback
6
+ in use prints one line at start (the terminal and the bot log):
7
+
8
+ ```
9
+ [deprecated] ~/.telegramCode is deprecated, rename it to ~/.charness (see MIGRATION_RENAME_TO_CHARNESS.md)
10
+ ```
11
+
12
+ The new name always wins when both exist. The fallbacks are a bridge, not a permanent feature — and at a cold
13
+ start the bot renames the config and data dirs itself, see [Automatic migration](#automatic-migration).
14
+
15
+ ## What was renamed
16
+
17
+ | Old | New | While the old one is still read |
18
+ |-----|-----|---------------------------------|
19
+ | `~/.config/telegramcode/.env` (and the older `~/.config/telegram-code/.env`) | `~/.config/charness/.env` | read when the new file does not exist |
20
+ | `~/.telegramCode` — the default `DATA_DIR` | `~/.charness` | used while `~/.charness` does not exist (or holds no `state.json` while the old dir does); an explicit `DATA_DIR` is never touched |
21
+ | `TELEGRAMCODE_HOT_RELOAD`, `TELEGRAMCODE_OPENCODE_PROCESS_FILE` | `CHARNESS_HOT_RELOAD`, `CHARNESS_OPENCODE_PROCESS_FILE` | read when the new one is unset; `charness hot` sets both |
22
+ | MCP header `x-telegramcode-mcp-client-id` | `x-charness-mcp-client-id` | the bot's MCP server accepts both |
23
+ | OpenCode plugin `telegramcode-compaction.js` (id `telegramcode-compaction`) | `charness-compaction.js` (id `charness-compaction`) | the old file is removed when the new one is installed |
24
+ | Docker image `telegramcode`, service `telegramcode`, container `telegramcode-main` | `charness`, `charness`, `charness-main` | a container of the old image keeps running as it is |
25
+ | `/opt/telegramcode`, `/home/telegramcode`, `/srv/telegramcode/…` (Docker mounts and host paths) | `/opt/charness`, `/home/charness`, `/srv/charness/…` | the new image's entrypoint accepts the old mount points |
26
+ | `telegramcode-restart-bot` | `charness-restart-bot` | the old name is a link in the new image and says so |
27
+ | compose variables `TELEGRAMCODE_DATA_DIR`, `TELEGRAMCODE_WORK_ROOT` | `CHARNESS_DATA_DIR`, `CHARNESS_WORK_ROOT` | `examples/docker-compose.yml` reads both |
28
+ | `/tmp/telegramcode-supervisor.pid`, `/tmp/telegramcode-restart-now`, `node_modules/.telegramcode-image` (inside the container) | the same with `charness-` / `.charness-image` | the old install stamp is still honoured |
29
+
30
+ Unchanged on purpose: the `telegramcode` and `telegramCode` commands (aliases of `charness` in `package.json`),
31
+ the `TELEGRAM_*` variables (they name Telegram, not the project) and every `DATA_DIR` you set explicitly.
32
+
33
+ ## Automatic migration
34
+
35
+ At a **cold start** the bot moves what it can, once, by itself:
36
+
37
+ | What | Becomes | Then |
38
+ |------|---------|------|
39
+ | `~/.config/telegramcode` (else the older `~/.config/telegram-code`) | `~/.config/charness` | a symlink `~/.config/telegramcode` → `charness` is left at the old path |
40
+ | `~/.telegramCode`, the **default** data dir | `~/.charness` | a symlink `~/.telegramCode` → `.charness` is left at the old path |
41
+ | `TELEGRAMCODE_*` keys in the config `.env` it just moved | `CHARNESS_*` | the original is kept next to it as `.env.bak` (a second backup becomes `.env.bak.<time>`) |
42
+
43
+ It logs one line per action, for example
44
+ `[migrate] moved ~/.telegramCode to ~/.charness; ~/.telegramCode is now a symlink to it`, into the terminal and
45
+ the bot log. The symlinks are relative, so running tmux / json-stream agents and your scripts that still use the
46
+ old paths keep working; delete a symlink when nothing uses it any more.
47
+
48
+ The rules it keeps:
49
+
50
+ - **Cold start only.** The plain `charness` start, and the start of the `charness hot` supervisor. A hot
51
+ worker's reload never migrates: its supervisor, and the agents it started, still hold files in the data dir.
52
+ A hot-mode instance therefore migrates when its supervisor is restarted.
53
+ - **Under the instance lock, before the state is loaded.** A live instance holding the lock blocks it (a line
54
+ says so; the next start tries again).
55
+ - **Never an explicit `DATA_DIR`**, whatever path it names, and **nothing at all for an isolated instance**
56
+ (`ENV_FILE` set: it reads only its own file, and the shared config and default data dir belong to another bot).
57
+ - **Only the global config file it moved** gets its keys renamed. `ENV_FILE` and a `$PWD/.env` are never
58
+ rewritten: the first is yours (often read-only, mounted into a container), the second belongs to the project
59
+ the bot was launched from. Rename keys there by hand if you use them.
60
+ - **Idempotent, and it never deletes anything.** A target that already exists, or an old path that is already
61
+ a symlink (yours, or one of its own), skips the step silently — a second start prints nothing. A step that
62
+ fails (another filesystem, no permission) is logged, leaves both sides usable (a failed symlink undoes its
63
+ move) and the old name keeps working with its deprecation line.
64
+
65
+ What it cannot fix stays announced: a `TELEGRAMCODE_*` variable set by systemd, your shell or Docker, a
66
+ `DATA_DIR` you set to an old-looking path, the Docker names and mounts, and a hot-mode instance until its
67
+ supervisor is restarted.
68
+
69
+ ## Steps by hand
70
+
71
+ Only needed where the automatic migration does not apply or failed — a hot-mode instance before its supervisor
72
+ restarts, an `ENV_FILE` instance, an explicit `DATA_DIR`, Docker. Order does not matter.
73
+
74
+ ### A plain npm install
75
+
76
+ 1. `npm install -g charness@latest`, then restart `charness` (or `charness hot`).
77
+ 2. The start does the renames itself (see above). If it logged that it could not, or you want it by hand:
78
+ stop the bot, `mv ~/.config/telegramcode ~/.config/charness`.
79
+ 3. Data dir, only if you rely on the default (no `DATA_DIR` in your env file). To keep it exactly where it is and
80
+ silence the line, add to `~/.config/charness/.env` (an explicit `DATA_DIR` is never migrated):
81
+
82
+ ```dotenv
83
+ DATA_DIR=/home/<you>/.telegramCode
84
+ ```
85
+
86
+ To move it by hand, stop the bot first and move it while **no agent is running**; the automatic migration
87
+ leaves a symlink for the ones that are, a hand `mv` does not: `mv ~/.telegramCode ~/.charness`, start the bot.
88
+ Update anything of yours that holds the old path (a cron entry, a script).
89
+ 4. If you start the bot with `TELEGRAMCODE_*` variables of your own, nothing reads them besides the two hot-mode
90
+ ones below; they are set by the supervisor, not by you.
91
+
92
+ ### A source checkout with self-update (hot mode)
93
+
94
+ 1. `scripts/self-update.sh` pulls the change; hot mode rebuilds and restarts the **worker**, which falls back to
95
+ the old names the **supervisor** still sets (`TELEGRAMCODE_HOT_RELOAD`, `TELEGRAMCODE_OPENCODE_PROCESS_FILE`)
96
+ and does not migrate.
97
+ 2. The update touches the supervisor's own files, so restart it once (`systemctl --user restart <unit>` or stop
98
+ and start `charness hot`): the new supervisor migrates the config and data dirs under the instance lock,
99
+ then sets the new variable names, and the deprecation lines about them stop. Agents survive the restart as
100
+ after any bot restart, and keep their old paths through the symlinks.
101
+ 3. Every host that mirrors this checkout (`git pull` on a timer) gets the same change and does the same when
102
+ its supervisor restarts.
103
+
104
+ ### Docker
105
+
106
+ A running container of the old image is not affected by the update: it runs the old entrypoint, with the
107
+ checkout mounted at `/opt/telegramcode`, and hot mode picks the new code up as above. Move to the new names when
108
+ you next rebuild the image:
109
+
110
+ 1. `cd <checkout> && docker build -t charness -f docker/Dockerfile .`
111
+ 2. Mount the checkout at `/opt/charness` and the agents' home at `/home/charness`. The new entrypoint still
112
+ starts from `/opt/telegramcode` and uses a non-empty `/home/telegramcode` while `/home/charness` is empty,
113
+ with a warning each; `docker exec` shells use `/home/charness`, so mount it there.
114
+ 3. Name the container `charness-<instance>` (or keep your own name; the instance lock only needs the hostname
115
+ to stay fixed). Restart only the bot with `docker exec <container> charness-restart-bot`.
116
+ 4. With `examples/docker-compose.yml`: copy the new file and rename `TELEGRAMCODE_DATA_DIR` and
117
+ `TELEGRAMCODE_WORK_ROOT` in your `.env` to `CHARNESS_DATA_DIR` and `CHARNESS_WORK_ROOT` (the old names still
118
+ work). The service name changed, so `docker compose down` the old one first, or `up` leaves it running next to
119
+ the new one.
120
+
121
+ ## What you may see after the update
122
+
123
+ - `[migrate] moved …` lines at a cold start: the automatic migration above, once.
124
+ - `[migrate] could not move …` / `skipped: another instance holds the lock`: the step is left for the next cold
125
+ start or for you; the old name keeps working.
126
+ - `[deprecated] … is deprecated, rename it to … (see MIGRATION_RENAME_TO_CHARNESS.md)` once per start for each
127
+ old name still in use: a hot worker's data dir or config dir (until its supervisor restarts), a failed move,
128
+ a plugin file or the MCP header (an agent session that was launched before the update still sends the old
129
+ one; a restarted session sends the new one).
130
+ - `[deprecated] TELEGRAMCODE_HOT_RELOAD … the running charness hot supervisor still sets it`: restart the
131
+ supervisor (above).
132
+ - The OpenCode compaction plugin is reinstalled under its new name and the old file is deleted; a folder whose
133
+ OpenCode instance already loaded the old plugin keeps it until OpenCode is restarted.