charness 3.0.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.
- package/.env.example +8 -7
- package/DEVELOPMENT.md +12 -6
- package/MIGRATION_1_TO_2.md +1 -1
- package/MIGRATION_RENAME_TO_CHARNESS.md +133 -0
- package/README.md +221 -555
- package/SETUP.md +539 -0
- package/dist/adapters/claudeCliAdapter.d.ts +16 -1
- package/dist/adapters/claudeCliAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeCliAdapter.js +37 -2
- package/dist/adapters/claudeCliAdapter.js.map +1 -1
- package/dist/adapters/claudeConfigDir.d.ts +40 -0
- package/dist/adapters/claudeConfigDir.d.ts.map +1 -0
- package/dist/adapters/claudeConfigDir.js +3 -0
- package/dist/adapters/claudeConfigDir.js.map +1 -0
- package/dist/adapters/claudeJsonStreamAdapter.d.ts +32 -0
- package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.js +90 -8
- package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
- package/dist/adapters/claudePlatformFlags.d.ts +4 -4
- package/dist/adapters/claudePlatformFlags.js +4 -4
- package/dist/adapters/createAdapter.d.ts +8 -0
- package/dist/adapters/createAdapter.d.ts.map +1 -1
- package/dist/adapters/createAdapter.js +37 -0
- package/dist/adapters/createAdapter.js.map +1 -1
- package/dist/adapters/openCodeAdapter.d.ts +23 -0
- package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/openCodeAdapter.js +85 -2
- package/dist/adapters/openCodeAdapter.js.map +1 -1
- package/dist/agentLogin/agentLogin.d.ts +15 -2
- package/dist/agentLogin/agentLogin.d.ts.map +1 -1
- package/dist/agentLogin/agentLogin.js +53 -16
- package/dist/agentLogin/agentLogin.js.map +1 -1
- package/dist/apiErrorRetry.d.ts +8 -3
- package/dist/apiErrorRetry.d.ts.map +1 -1
- package/dist/apiErrorRetry.js +36 -5
- package/dist/apiErrorRetry.js.map +1 -1
- package/dist/apiRetryKick.d.ts +9 -0
- package/dist/apiRetryKick.d.ts.map +1 -1
- package/dist/apiRetryKick.js +16 -0
- package/dist/apiRetryKick.js.map +1 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +642 -26
- package/dist/bot.js.map +1 -1
- package/dist/cli/bot.d.ts +4 -2
- package/dist/cli/bot.d.ts.map +1 -1
- package/dist/cli/bot.js +11 -3
- package/dist/cli/bot.js.map +1 -1
- package/dist/cli/botEntry.js +3 -1
- package/dist/cli/botEntry.js.map +1 -1
- package/dist/cli/claudeProfiles.d.ts +42 -0
- package/dist/cli/claudeProfiles.d.ts.map +1 -0
- package/dist/cli/claudeProfiles.js +106 -0
- package/dist/cli/claudeProfiles.js.map +1 -0
- package/dist/cli/envLoader.d.ts +6 -5
- package/dist/cli/envLoader.d.ts.map +1 -1
- package/dist/cli/envLoader.js +8 -27
- package/dist/cli/envLoader.js.map +1 -1
- package/dist/cli/hot.d.ts +2 -2
- package/dist/cli/hot.d.ts.map +1 -1
- package/dist/cli/hot.js +26 -16
- package/dist/cli/hot.js.map +1 -1
- package/dist/cli.js +19 -9
- package/dist/cli.js.map +1 -1
- package/dist/connectors/jira/adf.d.ts +23 -0
- package/dist/connectors/jira/adf.d.ts.map +1 -1
- package/dist/connectors/jira/adf.js +44 -0
- package/dist/connectors/jira/adf.js.map +1 -1
- package/dist/connectors/jira/answerSink.d.ts +27 -3
- package/dist/connectors/jira/answerSink.d.ts.map +1 -1
- package/dist/connectors/jira/answerSink.js +145 -18
- package/dist/connectors/jira/answerSink.js.map +1 -1
- package/dist/connectors/jira/attachmentTool.d.ts +7 -0
- package/dist/connectors/jira/attachmentTool.d.ts.map +1 -1
- package/dist/connectors/jira/attachmentTool.js +16 -0
- package/dist/connectors/jira/attachmentTool.js.map +1 -1
- package/dist/connectors/jira/client.d.ts +36 -0
- package/dist/connectors/jira/client.d.ts.map +1 -1
- package/dist/connectors/jira/client.js +46 -5
- package/dist/connectors/jira/client.js.map +1 -1
- package/dist/connectors/jira/config.d.ts +13 -17
- package/dist/connectors/jira/config.d.ts.map +1 -1
- package/dist/connectors/jira/config.js +15 -33
- package/dist/connectors/jira/config.js.map +1 -1
- package/dist/connectors/jira/connector.d.ts +10 -1
- package/dist/connectors/jira/connector.d.ts.map +1 -1
- package/dist/connectors/jira/connector.js +90 -16
- package/dist/connectors/jira/connector.js.map +1 -1
- package/dist/connectors/jira/contextLedger.d.ts +7 -0
- package/dist/connectors/jira/contextLedger.d.ts.map +1 -1
- package/dist/connectors/jira/contextLedger.js +18 -0
- package/dist/connectors/jira/contextLedger.js.map +1 -1
- package/dist/connectors/jira/contextPreamble.d.ts.map +1 -1
- package/dist/connectors/jira/contextPreamble.js +6 -3
- package/dist/connectors/jira/contextPreamble.js.map +1 -1
- package/dist/connectors/jira/inbound.d.ts +72 -10
- package/dist/connectors/jira/inbound.d.ts.map +1 -1
- package/dist/connectors/jira/inbound.js +204 -36
- package/dist/connectors/jira/inbound.js.map +1 -1
- package/dist/connectors/jira/issueBlocks.d.ts +31 -3
- package/dist/connectors/jira/issueBlocks.d.ts.map +1 -1
- package/dist/connectors/jira/issueBlocks.js +108 -29
- package/dist/connectors/jira/issueBlocks.js.map +1 -1
- package/dist/connectors/jira/issueContext.d.ts +11 -5
- package/dist/connectors/jira/issueContext.d.ts.map +1 -1
- package/dist/connectors/jira/issueContext.js +23 -6
- package/dist/connectors/jira/issueContext.js.map +1 -1
- package/dist/connectors/jira/issueDelta.d.ts +3 -0
- package/dist/connectors/jira/issueDelta.d.ts.map +1 -1
- package/dist/connectors/jira/issueDelta.js +15 -6
- package/dist/connectors/jira/issueDelta.js.map +1 -1
- package/dist/connectors/jira/mediaPlaceholders.d.ts +2 -0
- package/dist/connectors/jira/mediaPlaceholders.d.ts.map +1 -1
- package/dist/connectors/jira/mediaPlaceholders.js +16 -3
- package/dist/connectors/jira/mediaPlaceholders.js.map +1 -1
- package/dist/connectors/jira/prompt.d.ts +4 -0
- package/dist/connectors/jira/prompt.d.ts.map +1 -1
- package/dist/connectors/jira/prompt.js +20 -1
- package/dist/connectors/jira/prompt.js.map +1 -1
- package/dist/connectors/jira/sessionKeyCodec.d.ts +2 -0
- package/dist/connectors/jira/sessionKeyCodec.d.ts.map +1 -1
- package/dist/connectors/jira/sessionKeyCodec.js +5 -0
- package/dist/connectors/jira/sessionKeyCodec.js.map +1 -1
- package/dist/connectors/jira/trigger.d.ts +16 -3
- package/dist/connectors/jira/trigger.d.ts.map +1 -1
- package/dist/connectors/jira/trigger.js +17 -2
- package/dist/connectors/jira/trigger.js.map +1 -1
- package/dist/connectors/jira/triggerLog.d.ts +12 -3
- package/dist/connectors/jira/triggerLog.d.ts.map +1 -1
- package/dist/connectors/jira/triggerLog.js +18 -2
- package/dist/connectors/jira/triggerLog.js.map +1 -1
- package/dist/connectors/jira/trustedGroup.d.ts +54 -0
- package/dist/connectors/jira/trustedGroup.d.ts.map +1 -0
- package/dist/connectors/jira/trustedGroup.js +98 -0
- package/dist/connectors/jira/trustedGroup.js.map +1 -0
- package/dist/connectors/telegram/commands/autoContinueLimits.d.ts +3 -0
- package/dist/connectors/telegram/commands/autoContinueLimits.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/autoContinueLimits.js +15 -45
- package/dist/connectors/telegram/commands/autoContinueLimits.js.map +1 -1
- package/dist/connectors/telegram/commands/claudeAccounts.d.ts +58 -0
- package/dist/connectors/telegram/commands/claudeAccounts.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/claudeAccounts.js +591 -0
- package/dist/connectors/telegram/commands/claudeAccounts.js.map +1 -0
- package/dist/connectors/telegram/commands/fallbackChain.d.ts +49 -0
- package/dist/connectors/telegram/commands/fallbackChain.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/fallbackChain.js +624 -0
- package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -0
- package/dist/connectors/telegram/commands/modelProviders.d.ts +23 -1
- package/dist/connectors/telegram/commands/modelProviders.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/modelProviders.js +131 -6
- package/dist/connectors/telegram/commands/modelProviders.js.map +1 -1
- package/dist/i18n/de.d.ts.map +1 -1
- package/dist/i18n/de.js +137 -9
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +137 -9
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +137 -9
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +137 -9
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/hi.d.ts.map +1 -1
- package/dist/i18n/hi.js +137 -9
- package/dist/i18n/hi.js.map +1 -1
- package/dist/i18n/ja.d.ts.map +1 -1
- package/dist/i18n/ja.js +137 -9
- package/dist/i18n/ja.js.map +1 -1
- package/dist/i18n/ka.d.ts.map +1 -1
- package/dist/i18n/ka.js +137 -9
- package/dist/i18n/ka.js.map +1 -1
- package/dist/i18n/pt.d.ts.map +1 -1
- package/dist/i18n/pt.js +137 -9
- package/dist/i18n/pt.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +137 -9
- package/dist/i18n/ru.js.map +1 -1
- package/dist/i18n/uk.d.ts.map +1 -1
- package/dist/i18n/uk.js +137 -9
- package/dist/i18n/uk.js.map +1 -1
- package/dist/i18n/uz.d.ts.map +1 -1
- package/dist/i18n/uz.js +137 -9
- package/dist/i18n/uz.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +137 -9
- package/dist/i18n/zh.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/installManager.d.ts +16 -2
- package/dist/installManager.d.ts.map +1 -1
- package/dist/installManager.js +42 -12
- package/dist/installManager.js.map +1 -1
- package/dist/instanceLock.d.ts.map +1 -1
- package/dist/instanceLock.js +10 -8
- package/dist/instanceLock.js.map +1 -1
- package/dist/legacyMigration.d.ts +69 -0
- package/dist/legacyMigration.d.ts.map +1 -0
- package/dist/legacyMigration.js +338 -0
- package/dist/legacyMigration.js.map +1 -0
- package/dist/legacyNames.d.ts +107 -0
- package/dist/legacyNames.d.ts.map +1 -0
- package/dist/legacyNames.js +230 -0
- package/dist/legacyNames.js.map +1 -0
- package/dist/platform/answerSink.d.ts +5 -0
- package/dist/platform/answerSink.d.ts.map +1 -1
- package/dist/platform/answerSink.js.map +1 -1
- package/dist/requests/answerRequest.d.ts +2 -0
- package/dist/requests/answerRequest.d.ts.map +1 -1
- package/dist/requests/answerRequest.js +3 -1
- package/dist/requests/answerRequest.js.map +1 -1
- package/dist/requests/answerStyle.d.ts +11 -0
- package/dist/requests/answerStyle.d.ts.map +1 -0
- package/dist/requests/answerStyle.js +14 -0
- package/dist/requests/answerStyle.js.map +1 -0
- package/dist/requests/answerTail.d.ts.map +1 -1
- package/dist/requests/answerTail.js +2 -0
- package/dist/requests/answerTail.js.map +1 -1
- package/dist/requests/requestHeader.d.ts.map +1 -1
- package/dist/requests/requestHeader.js +3 -0
- package/dist/requests/requestHeader.js.map +1 -1
- package/dist/requests/requestLedger.js +1 -1
- package/dist/requests/requestLedger.js.map +1 -1
- package/dist/requests/types.d.ts +3 -1
- package/dist/requests/types.d.ts.map +1 -1
- package/dist/scheduler/mcpSurface.d.ts +17 -1
- package/dist/scheduler/mcpSurface.d.ts.map +1 -1
- package/dist/scheduler/mcpSurface.js +86 -13
- package/dist/scheduler/mcpSurface.js.map +1 -1
- package/dist/state.d.ts +175 -2
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +303 -2
- package/dist/state.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/autoContinueOnLimit.d.ts +7 -0
- package/dist/utils/autoContinueOnLimit.d.ts.map +1 -1
- package/dist/utils/autoContinueOnLimit.js +10 -0
- package/dist/utils/autoContinueOnLimit.js.map +1 -1
- package/dist/utils/claudeAccountPickerPlan.d.ts +85 -0
- package/dist/utils/claudeAccountPickerPlan.d.ts.map +1 -0
- package/dist/utils/claudeAccountPickerPlan.js +123 -0
- package/dist/utils/claudeAccountPickerPlan.js.map +1 -0
- package/dist/utils/claudeLimitSwitch.d.ts +40 -0
- package/dist/utils/claudeLimitSwitch.d.ts.map +1 -0
- package/dist/utils/claudeLimitSwitch.js +54 -0
- package/dist/utils/claudeLimitSwitch.js.map +1 -0
- package/dist/utils/claudeProfileUsageLines.d.ts +15 -0
- package/dist/utils/claudeProfileUsageLines.d.ts.map +1 -0
- package/dist/utils/claudeProfileUsageLines.js +42 -0
- package/dist/utils/claudeProfileUsageLines.js.map +1 -0
- package/dist/utils/claudeProfiles.d.ts +124 -0
- package/dist/utils/claudeProfiles.d.ts.map +1 -0
- package/dist/utils/claudeProfiles.js +304 -0
- package/dist/utils/claudeProfiles.js.map +1 -0
- package/dist/utils/claudeStreamJson.d.ts +13 -1
- package/dist/utils/claudeStreamJson.d.ts.map +1 -1
- package/dist/utils/claudeStreamJson.js +13 -0
- package/dist/utils/claudeStreamJson.js.map +1 -1
- package/dist/utils/claudeUsage.d.ts +209 -0
- package/dist/utils/claudeUsage.d.ts.map +1 -0
- package/dist/utils/claudeUsage.js +413 -0
- package/dist/utils/claudeUsage.js.map +1 -0
- package/dist/utils/claudeUsageRefresher.d.ts +44 -0
- package/dist/utils/claudeUsageRefresher.d.ts.map +1 -0
- package/dist/utils/claudeUsageRefresher.js +95 -0
- package/dist/utils/claudeUsageRefresher.js.map +1 -0
- package/dist/utils/fallbackBridge.d.ts +32 -0
- package/dist/utils/fallbackBridge.d.ts.map +1 -0
- package/dist/utils/fallbackBridge.js +62 -0
- package/dist/utils/fallbackBridge.js.map +1 -0
- package/dist/utils/fallbackChain.d.ts +299 -0
- package/dist/utils/fallbackChain.d.ts.map +1 -0
- package/dist/utils/fallbackChain.js +542 -0
- package/dist/utils/fallbackChain.js.map +1 -0
- package/dist/utils/jsonStreamHost.d.ts +14 -3
- package/dist/utils/jsonStreamHost.d.ts.map +1 -1
- package/dist/utils/jsonStreamHost.js +26 -5
- package/dist/utils/jsonStreamHost.js.map +1 -1
- package/dist/utils/modelRecentPlan.d.ts +56 -0
- package/dist/utils/modelRecentPlan.d.ts.map +1 -0
- package/dist/utils/modelRecentPlan.js +107 -0
- package/dist/utils/modelRecentPlan.js.map +1 -0
- package/dist/utils/openCodeCompactPlugin.d.ts +11 -3
- package/dist/utils/openCodeCompactPlugin.d.ts.map +1 -1
- package/dist/utils/openCodeCompactPlugin.js +37 -5
- package/dist/utils/openCodeCompactPlugin.js.map +1 -1
- package/dist/utils/threadStatusReport.d.ts +25 -1
- package/dist/utils/threadStatusReport.d.ts.map +1 -1
- package/dist/utils/threadStatusReport.js +24 -1
- package/dist/utils/threadStatusReport.js.map +1 -1
- package/examples/.env.example +7 -7
- package/examples/docker-compose.yml +15 -14
- package/package.json +3 -1
package/SETUP.md
ADDED
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
# Setup
|
|
2
|
+
|
|
3
|
+
How to install, configure and run Charness. The common part comes first — where to run it, install, the
|
|
4
|
+
environment, several instances on one host, updating; then follow the surface you use:
|
|
5
|
+
[Telegram](#telegram-setup) or [Jira](#jira-setup). The whole bot can also run in a container instead of through
|
|
6
|
+
npm — see [Alternatives](#alternatives) at the end. What Charness does is in the [README](README.md).
|
|
7
|
+
|
|
8
|
+
## Common setup
|
|
9
|
+
|
|
10
|
+
### Where to run the bot server
|
|
11
|
+
|
|
12
|
+
The bot runs anywhere the agent CLIs run:
|
|
13
|
+
|
|
14
|
+
- **Your own working machine** — the simplest start: launch `charness`
|
|
15
|
+
from your projects parent folder and your laptop/desktop becomes the
|
|
16
|
+
backend. The catch: agents are only reachable while the machine is on and
|
|
17
|
+
awake.
|
|
18
|
+
- **A remote server (cloud VPS/VDS or bare metal)** — the more convenient
|
|
19
|
+
setup: organize your working environment there once (git + your repos,
|
|
20
|
+
Claude Code / OpenCode, `charness`) and you get an always-on dev box you
|
|
21
|
+
drive from any device through Telegram — phone, tablet, voice. When picking
|
|
22
|
+
one, a bare-metal server without virtualization beats a virtualized VPS/VDS:
|
|
23
|
+
its NVMe drives are usually much faster, which matters once you also build
|
|
24
|
+
and run a dev server there, not just the agents. Classic terminal access to
|
|
25
|
+
the very same Claude sessions stays available over SSH — run plain `claude`
|
|
26
|
+
in the project folder: it reads the same `~/.claude/projects/<cwd-slug>/`
|
|
27
|
+
session store the bot uses, so a session started in a Telegram thread can
|
|
28
|
+
be picked up in the terminal and vice versa.
|
|
29
|
+
|
|
30
|
+
### Install the CLI
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install -g charness # needs Node ≥ 22.12
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This registers the `charness` command; the former `telegramcode` command (and
|
|
37
|
+
`telegramCode`) still works as an alias. Coming from the old `telegramcode` npm
|
|
38
|
+
package (2.x)? Run `npm uninstall -g telegramcode` first: both install the same
|
|
39
|
+
commands. The config, `DATA_DIR` and sessions carry over as they are: a
|
|
40
|
+
`~/.config/telegramcode/.env` is still read while `~/.config/charness/.env` does
|
|
41
|
+
not exist, and a `~/.telegramCode` data dir is still used while `~/.charness` does
|
|
42
|
+
not exist. At a cold start the bot renames those two dirs itself (leaving a symlink
|
|
43
|
+
at the old path) and says so; every old name still in use prints one deprecation
|
|
44
|
+
line. What it does, its limits and the steps by hand:
|
|
45
|
+
[MIGRATION_RENAME_TO_CHARNESS.md](MIGRATION_RENAME_TO_CHARNESS.md).
|
|
46
|
+
|
|
47
|
+
### Environment variables
|
|
48
|
+
|
|
49
|
+
These settings apply to every surface. The Telegram ones — the bot token, the group and the DM, voice — are listed
|
|
50
|
+
under [Telegram environment variables](#telegram-environment-variables).
|
|
51
|
+
|
|
52
|
+
#### External Optional
|
|
53
|
+
|
|
54
|
+
| Variable | Default | Description |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| `DATA_DIR` | `~/.charness` (an existing `~/.telegramCode` is kept while `~/.charness` does not exist) | Per-instance state. **Mandatory** if you run two bots on the same host — otherwise both share `state.json` and `mcp.json` and corrupt each other |
|
|
57
|
+
|
|
58
|
+
Agent provider/auth setup is normally done inside the agents themselves:
|
|
59
|
+
`claude login` for Claude CLI and `/connect <provider-id>` (for example,
|
|
60
|
+
`/connect openrouter`) or OpenCode's own config/plugins for OpenCode. No provider
|
|
61
|
+
API key env var is required by the bot for text sessions. For OpenCode, install
|
|
62
|
+
any third-party provider plugins or authentication resolvers before launch if
|
|
63
|
+
your chosen providers need them.
|
|
64
|
+
|
|
65
|
+
#### Advanced / Not Normally Needed
|
|
66
|
+
|
|
67
|
+
| Variable | Default | Set only when |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| `WORK_ROOT` | `$PWD` | You cannot control the process cwd; normal launch uses `cd <projects-parent> && charness` |
|
|
70
|
+
| `OPENCODE_URL` | `http://localhost:4096` | You use a custom OpenCode port or external server; the port must differ per instance |
|
|
71
|
+
| `OPENCODE_USERNAME` | `opencode` | `OPENCODE_PASSWORD` is set for a protected OpenCode server |
|
|
72
|
+
| `OPENCODE_PASSWORD` | — | Connecting to a protected OpenCode server |
|
|
73
|
+
| `OPENCODE_ALLOW_REMOTE` | — | `OPENCODE_URL` intentionally points outside loopback |
|
|
74
|
+
| `OPENCODE_BIN` | (auto) | The `opencode` binary is not on PATH or you use a fork |
|
|
75
|
+
| `CLAUDE_BIN` | (auto) | The `claude` binary is not on PATH due to nvm/asdf/systemd PATH differences |
|
|
76
|
+
| `ANTHROPIC_API_KEY` | — | A custom MCP/OpenCode plugin/auth resolver explicitly reads it; not needed for normal Claude CLI auth. The json-stream Claude backend strips it from the agent's env (subscription billing) |
|
|
77
|
+
| `SCHEDULER_MCP_PORT` | an OS-chosen free loopback port | You need a stable, explicitly chosen port; it must differ from this instance's `OPENCODE_URL` port |
|
|
78
|
+
| `CLAUDE_SCRAPE_DEBUG` | off | You are debugging Claude tmux scraping and need full RAW/FILTERED chunks |
|
|
79
|
+
| `AGENT_IDLE_MINUTES` | `55` | A json-stream Claude topic idle for this long is compacted (when `/compact_on_idle` allows) and its process stopped; the session sleeps and the next message resumes it — shorten it only for a test; a non-positive or non-numeric value keeps the default |
|
|
80
|
+
| `REQUEST_BACKSTOP_MINUTES` | `90` | A request (a Jira hand-over, a message in an answers-only topic) with nothing seen working on it for this long is re-posted to its session — shorten it only for a test; a non-positive or non-numeric value keeps the default |
|
|
81
|
+
| `TMUX_SOCKET_NAME` | — (the default tmux server) | The instance must run its agents on its OWN tmux server (`tmux -L <name>`; any plain name except `default`). Recommended for a second instance on one host: at boot an instance kills every agent session on its server that its own state does not know |
|
|
82
|
+
| `ENV_FILE` | — | Absolute path of the ONLY env file to read — no `~/.config/charness/.env`, no `$PWD/.env`; its values win over the inherited environment. Set it in the launching environment, never inside an env file (the start refuses that). `scripts/run-isolated.sh <env-file>` (in a checkout) starts an instance with a clean environment plus this variable |
|
|
83
|
+
| `CONNECTORS` | `telegram` | Experimental: the surfaces this instance serves, as a comma list — see [Jira setup](#jira-setup). An instance that lists `jira` refuses to start on Node below 22.12 and without `ENV_FILE`, `TMUX_SOCKET_NAME` and `DATA_DIR/jira.json`, and — with Telegram off — with a `TELEGRAM_BOT_TOKEN` or any `ATLASSIAN_*` variable in its environment. Any instance refuses to start on a `DATA_DIR` that holds conversations of a surface it does not serve |
|
|
84
|
+
|
|
85
|
+
> `WORK_DIR` (1.x) is retired. Use the wrapper from the desired parent folder
|
|
86
|
+
> instead of carrying the old env forward.
|
|
87
|
+
|
|
88
|
+
### Two instances on one host
|
|
89
|
+
|
|
90
|
+
Two host instances, or a host instance next to a container: each pair of variables below must differ to avoid
|
|
91
|
+
silent corruption. Two containers need only different tokens and groups (Telegram), `DATA_DIR`s, container names and
|
|
92
|
+
hostnames: their ports and tmux servers are their own.
|
|
93
|
+
|
|
94
|
+
| What | Why it must differ |
|
|
95
|
+
|---|---|
|
|
96
|
+
| `TELEGRAM_BOT_TOKEN` (Telegram) | Telegram routes updates to a single long-poller per token; sharing → message loss |
|
|
97
|
+
| `ALLOWED_GROUP_ID` (Telegram) | The bot gates by group id; sharing → cross-instance leakage |
|
|
98
|
+
| `WORK_ROOT` | Each instance manages its subtree; sharing → tmux name collisions |
|
|
99
|
+
| `DATA_DIR` | `state.json` / `mcp.json` / `threads/` per instance; sharing → corrupted JSON |
|
|
100
|
+
| `OPENCODE_URL` port | OpenCode server binds the port; second start fails with `EADDRINUSE` and you'd silently share sessions |
|
|
101
|
+
| `SCHEDULER_MCP_PORT` | Optional stable scheduler-MCP port; if set, it must differ from that instance's `OPENCODE_URL` port |
|
|
102
|
+
| `TMUX_SOCKET_NAME` | Optional, recommended: each instance's boot kills the agent sessions on its tmux server that its own state does not know — on one shared server, the other instance's |
|
|
103
|
+
|
|
104
|
+
### Updating
|
|
105
|
+
|
|
106
|
+
An npm install updates with `npm install -g charness@latest`; then restart `charness` (what survives a restart:
|
|
107
|
+
[Restart behaviour](README.md#restart-behaviour)).
|
|
108
|
+
|
|
109
|
+
**An update that renames something ships a migration guide** — read it before the restart. The names that were
|
|
110
|
+
renamed from TelegramCode to Charness (environment variables, the data dir, the Docker names, …) still work for
|
|
111
|
+
now and print a deprecation line at start; the steps are in
|
|
112
|
+
[MIGRATION_RENAME_TO_CHARNESS.md](MIGRATION_RENAME_TO_CHARNESS.md), the summary in the top entry of
|
|
113
|
+
[CHANGELOG.md](CHANGELOG.md). `scripts/self-update.sh` names a newly added migration guide in its log.
|
|
114
|
+
|
|
115
|
+
#### Updating a checkout (self-update, no root)
|
|
116
|
+
|
|
117
|
+
A checkout — the one the [Docker container](#run-with-docker) runs, or a clone from
|
|
118
|
+
[DEVELOPMENT.md](DEVELOPMENT.md#local-development) — updates with `scripts/self-update.sh` (not in the npm package).
|
|
119
|
+
It refreshes the checkout in place, running as the checkout's owning user — no root, no cross-user copying. It is
|
|
120
|
+
safe to run blindly (e.g. from cron):
|
|
121
|
+
|
|
122
|
+
- fast-forward only: it skips silently when the tree has tracked changes, a
|
|
123
|
+
merge/rebase is in progress, or local history diverged from the upstream —
|
|
124
|
+
a dev clone that is ahead of origin is never touched;
|
|
125
|
+
- `yarn install --immutable` runs only when `yarn.lock` / `package.json`
|
|
126
|
+
changed;
|
|
127
|
+
- a hot-mode instance (`charness hot`) rebuilds and restarts the worker
|
|
128
|
+
by itself (after a dependency install the script touches `tsconfig.json`
|
|
129
|
+
so `tsc -w` recompiles with the new modules); a non-hot instance gets
|
|
130
|
+
`yarn build` plus a restart notice — the script never kills processes;
|
|
131
|
+
- changes to the hot supervisor itself (`src/cli.ts`, `src/cli/hot.ts`,
|
|
132
|
+
`nodemon.json`) are flagged with a warning: those need a manual
|
|
133
|
+
`charness hot` restart (nodemon reloads only the worker).
|
|
134
|
+
|
|
135
|
+
For unattended updates give the deploying user read access to the repo (e.g.
|
|
136
|
+
a read-only GitLab deploy key on a passphrase-less SSH key) and add a cron
|
|
137
|
+
entry:
|
|
138
|
+
|
|
139
|
+
```cron
|
|
140
|
+
*/10 * * * * /path/to/charness/scripts/self-update.sh >> "$HOME/.local/state/charness/self-update.log" 2>&1
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
(create the log directory once: `mkdir -p ~/.local/state/charness`).
|
|
144
|
+
|
|
145
|
+
## Telegram setup
|
|
146
|
+
|
|
147
|
+
Four steps: create a bot, (optionally) set up a group, launch from your projects folder, bind a topic to an agent.
|
|
148
|
+
The CLI is installed first — see [Install the CLI](#install-the-cli). After the steps: the
|
|
149
|
+
[required files structure](#required-files-structure) and the
|
|
150
|
+
[Telegram environment variables](#telegram-environment-variables).
|
|
151
|
+
|
|
152
|
+
> **[manual]** tags a step you must do by hand in the Telegram app — an agent
|
|
153
|
+
> running on the host can't do it for you. Everything unmarked is a host-side
|
|
154
|
+
> command (or file edit) that can be automated.
|
|
155
|
+
|
|
156
|
+
### 1. Create the bot
|
|
157
|
+
|
|
158
|
+
**[manual]** In Telegram, with @BotFather:
|
|
159
|
+
|
|
160
|
+
1. Message [@BotFather](https://t.me/BotFather), send `/newbot`, follow prompts.
|
|
161
|
+
2. Save the token (`123456789:ABCdef...`).
|
|
162
|
+
3. **Disable privacy mode** — same chat: `/setprivacy` → pick this bot →
|
|
163
|
+
`Disable`. Without this the bot only sees `/commands`, not free-form text.
|
|
164
|
+
|
|
165
|
+
<p><img src="docs/images/01-botfather.png" width="360" alt="@BotFather: /newbot to get the token, then /setprivacy → this bot → Disable" /></p>
|
|
166
|
+
|
|
167
|
+
Put the token where the bot reads it — the global config `.env`:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
mkdir -p ~/.config/charness
|
|
171
|
+
$EDITOR ~/.config/charness/.env
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```dotenv
|
|
175
|
+
# ~/.config/charness/.env — the one place your keys live
|
|
176
|
+
TELEGRAM_BOT_TOKEN=123456789:ABCdef...
|
|
177
|
+
# GROQ_API_KEY=... # optional: free voice transcription
|
|
178
|
+
# OWNER_USER_ID=... # set to drive the bot from its DM (step 2)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
All keys the bot needs live in this one file — the bot token and the optional
|
|
182
|
+
`GROQ_API_KEY` for voice sit side by side, no separate stores. (Agent
|
|
183
|
+
provider auth is the exception, and lives inside the agents themselves:
|
|
184
|
+
`claude login` for Claude, `/connect` or OpenCode's own config for OpenCode —
|
|
185
|
+
see [Environment Variables](#environment-variables).) The wrapper loads env
|
|
186
|
+
from two locations, in order — a global base and an optional per-project
|
|
187
|
+
override:
|
|
188
|
+
|
|
189
|
+
1. `~/.config/charness/.env` — base, set once, used everywhere.
|
|
190
|
+
2. `$PWD/.env` — per-project tweaks (last write wins).
|
|
191
|
+
|
|
192
|
+
The full annotated template is `.env.example` (shipped with the package and in
|
|
193
|
+
the repo).
|
|
194
|
+
|
|
195
|
+
### 2. Set up a group (optional) or DM
|
|
196
|
+
|
|
197
|
+
The bot serves a **forum supergroup**, the **owner's private chat (DM)**, or
|
|
198
|
+
both at once (`CHAT_MODE`, default `both`). The group is the nicest UX — a
|
|
199
|
+
visible topic list, per-topic names/icons, quick agent switching — but it is
|
|
200
|
+
**optional**: with `OWNER_USER_ID` set you can run entirely from the bot's DM.
|
|
201
|
+
|
|
202
|
+
**To use a group (recommended)** — **[manual]**, all in the Telegram client:
|
|
203
|
+
|
|
204
|
+
1. In a Telegram client: `New Group` → name it → add the bot.
|
|
205
|
+
2. Open group settings → enable **Topics** (Forum mode).
|
|
206
|
+
3. Promote the bot to admin with these rights:
|
|
207
|
+
- `Manage Topics` (required — bind/create threads)
|
|
208
|
+
- `Delete Messages` (for `/clear_messages`)
|
|
209
|
+
- `Pin Messages` (per-thread status banner + question alerts; `/doctor`
|
|
210
|
+
warns if missing, but the bot still runs without it)
|
|
211
|
+
4. **Remove the bot from the group and add it again.** Telegram caches the
|
|
212
|
+
privacy-mode flag on join; without re-adding, the bot keeps private-mode and
|
|
213
|
+
ignores free-form messages (see
|
|
214
|
+
[Troubleshooting → Bot doesn't see text](README.md#bot-doesnt-see-text-telegram)).
|
|
215
|
+
|
|
216
|
+
<p>
|
|
217
|
+
<img src="docs/images/02-enable-topics.png" width="360" alt="Group settings → Topics toggle enabled (Forum mode)" />
|
|
218
|
+
<img src="docs/images/03-promote-admin.png" width="360" alt="Bot admin rights: Manage Topics, Delete Messages, Pin Messages ticked" />
|
|
219
|
+
</p>
|
|
220
|
+
|
|
221
|
+
The group **id is automatic** — leave `ALLOWED_GROUP_ID` empty and the bot
|
|
222
|
+
auto-pairs with the first forum supergroup an admin talks to it from (the
|
|
223
|
+
`-100…` id is saved to `state.json`; re-point later with `/pair`). To pin a
|
|
224
|
+
specific id by hand, set `ALLOWED_GROUP_ID` to the numeric value (a group
|
|
225
|
+
**name** is not accepted) — that also disables auto-pairing. **Access control:**
|
|
226
|
+
whoever is a creator/administrator of that group may drive the bot — there is no
|
|
227
|
+
separate allow-list.
|
|
228
|
+
|
|
229
|
+
**To use the DM instead (or as well):** **[manual]** send `/start` to
|
|
230
|
+
[@userinfobot](https://t.me/userinfobot) for your numeric user id, then add it
|
|
231
|
+
(host-side) to the same `.env`:
|
|
232
|
+
|
|
233
|
+
```dotenv
|
|
234
|
+
OWNER_USER_ID=987654321
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
With the default `CHAT_MODE=both`, an unset `OWNER_USER_ID` just leaves the DM
|
|
238
|
+
surface inert (group-only); set it and the DM lights up alongside the group. Use
|
|
239
|
+
`CHAT_MODE=dm` to skip the group entirely.
|
|
240
|
+
|
|
241
|
+
### 3. Launch from your projects folder
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
cd ~/projects && charness
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
That `$PWD` — the parent folder holding your repositories — is the folder the
|
|
248
|
+
bot works in; each topic binds to a subfolder under it. There's nothing else to
|
|
249
|
+
configure for it. A single-instance lockfile (`$DATA_DIR/instance.lock`) stops a
|
|
250
|
+
second bot starting under the same user; stale locks (after `kill -9`) are
|
|
251
|
+
reclaimed automatically.
|
|
252
|
+
|
|
253
|
+
### 4. Bind a topic and talk to an agent
|
|
254
|
+
|
|
255
|
+
This step is **[manual]** — it all happens inside the Telegram app.
|
|
256
|
+
|
|
257
|
+
**In the group:**
|
|
258
|
+
|
|
259
|
+
1. Open the group; in the General topic send `/ls` — the bot lists subfolders
|
|
260
|
+
under the work root.
|
|
261
|
+
2. Create a topic (the `+` button).
|
|
262
|
+
3. In the new topic: `/bind <subdir>` (auto-bound if the topic name matches a
|
|
263
|
+
subdir).
|
|
264
|
+
4. `/claude` or `/opencode` → talk to the agent (text or voice).
|
|
265
|
+
|
|
266
|
+
<p><img src="docs/images/04-bind-and-run.png" width="360" alt="A topic bound with /bind, /claude started, and the agent replying" /></p>
|
|
267
|
+
|
|
268
|
+
**In the DM:** the same commands, one thread per agent — `/ls`,
|
|
269
|
+
`/bind <subdir>`, then `/claude` or `/opencode`.
|
|
270
|
+
|
|
271
|
+
Then: `/quit` ends the session; bare `/bind` inspects/reconfigures the binding;
|
|
272
|
+
`/clear_messages` deletes the topic's bot messages.
|
|
273
|
+
|
|
274
|
+
> **Continue the same session from a terminal.** No wrapper needed: run
|
|
275
|
+
> `claude --dangerously-skip-permissions` in the project folder. It is the same
|
|
276
|
+
> binary and the same `~/.claude/projects/<cwd-slug>/` session store the bot
|
|
277
|
+
> uses, so a thread started in Telegram can be picked up with `claude --resume`
|
|
278
|
+
> and vice versa.
|
|
279
|
+
|
|
280
|
+
### Required files structure
|
|
281
|
+
|
|
282
|
+
Launch `charness` from the parent folder that holds your project repos —
|
|
283
|
+
that `$PWD` is the work root, and every topic binds to a subfolder under it:
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
$PWD=/home/user/src ← run the bot here ($PWD = work root)
|
|
287
|
+
├── projectA/ ← Topic "projectA" (claude)
|
|
288
|
+
├── projectB/ ← Topic "projB-frontend" (claude)
|
|
289
|
+
│ ← Topic "projB-backend" (opencode) ← one folder, two topics
|
|
290
|
+
│ ← Topic "projB-refactor" (claude)
|
|
291
|
+
└── projectC/ ← Topic "projectC" (opencode)
|
|
292
|
+
|
|
293
|
+
Telegram forum supergroup
|
|
294
|
+
├── Bot is admin with can_manage_topics + can_delete_messages + can_pin_messages
|
|
295
|
+
└── Routes each topic by (chatId, threadId) → remembered in state.json
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**What the bot remembers (`state.json`).** So a restart is seamless, the bot
|
|
299
|
+
saves which topic is bound to which folder, each topic's live agent session (to
|
|
300
|
+
re-attach it after a reboot), your per-topic preferences (agent, model,
|
|
301
|
+
reasoning effort, language, display verbosity), scheduled prompts, and the
|
|
302
|
+
paired group id. This file lives in `DATA_DIR` (default `~/.charness`) and
|
|
303
|
+
is written safely, so a crash can't corrupt it.
|
|
304
|
+
|
|
305
|
+
### Telegram environment variables
|
|
306
|
+
|
|
307
|
+
The settings of the Telegram surface; the ones every surface shares are under
|
|
308
|
+
[Environment variables](#environment-variables).
|
|
309
|
+
|
|
310
|
+
#### Set Before Launch
|
|
311
|
+
|
|
312
|
+
| Variable | Description |
|
|
313
|
+
|---|---|
|
|
314
|
+
| `TELEGRAM_BOT_TOKEN` | Token from @BotFather. Telegram only: a Jira-only instance refuses to start with it set — see [Jira setup](#jira-setup) |
|
|
315
|
+
|
|
316
|
+
Start from the parent folder containing your projects: `cd ~/projects && charness`.
|
|
317
|
+
That `$PWD` is the folder the bot works in — nothing else to set for it.
|
|
318
|
+
|
|
319
|
+
**Access control.** There is no user allow-list. Whoever is a **creator or
|
|
320
|
+
administrator of the served forum group** may talk to the agent — read live from
|
|
321
|
+
Telegram (`getChatAdministrators`) and cached for 1h. Promote someone in the
|
|
322
|
+
group to grant access; demote/remove them to revoke it — the bot subscribes to
|
|
323
|
+
`chat_member` updates, so an admin change invalidates the cache and takes
|
|
324
|
+
effect immediately (the 1h TTL is only the fallback). The bot must be a group
|
|
325
|
+
admin itself (it already needs that to create topics and pin). Anonymous admins
|
|
326
|
+
can't be matched from their messages, so post non-anonymously. The DM surface
|
|
327
|
+
(when enabled) is gated separately: only the configured `OWNER_USER_ID` may
|
|
328
|
+
talk to the bot there.
|
|
329
|
+
|
|
330
|
+
> **Security model — group admin (or the DM owner) ⇒ shell on the host.** The agents run with
|
|
331
|
+
> permission checks disabled (`--dangerously-skip-permissions` for Claude,
|
|
332
|
+
> auto-approve for OpenCode) and `/terminal` opens a raw `$SHELL` in the bound
|
|
333
|
+
> folder, so anyone who can talk to the bot can execute arbitrary commands as
|
|
334
|
+
> the bot's OS user. Only promote people you would trust with SSH access to
|
|
335
|
+
> that machine, and keep the served group itself private.
|
|
336
|
+
|
|
337
|
+
#### External Optional (Telegram)
|
|
338
|
+
|
|
339
|
+
| Variable | Default | Description |
|
|
340
|
+
|---|---|---|
|
|
341
|
+
| `ALLOWED_GROUP_ID` | (auto-pair) | Numeric forum supergroup id (`-100…`). Leave empty to auto-pair with the first forum group a group **admin/creator** contacts the bot from (id is saved to `state.json`; re-point with `/pair`). A **name** is not accepted. A numeric value disables auto-pairing |
|
|
342
|
+
| `CHAT_MODE` | `both` | Which surface(s) this instance serves: `group`, `dm`, or `both` — see [Two surfaces](README.md#two-surfaces-group-topics-bot-dm-or-both) |
|
|
343
|
+
| `OWNER_USER_ID` | — | **Optional.** Numeric Telegram user id of the owner — leave it unset to run group-only (the DM surface stays inert; a group works fully without it). Set it only to enable the owner-DM surface; **required** solely for `CHAT_MODE=dm` |
|
|
344
|
+
| `GROQ_API_KEY` | — | Recommended for voice transcription. Without it, voice messages are not transcribed unless you intentionally configure the OpenAI fallback |
|
|
345
|
+
|
|
346
|
+
**Localized in 12 languages** — the bot UI (commands, buttons, notices) speaks
|
|
347
|
+
中文, English, Français, ქართული, Deutsch, हिन्दी, 日本語, Português, Русский,
|
|
348
|
+
Español, Українська, Oʻzbekcha. The language is automatic per Telegram chat:
|
|
349
|
+
explicit `/language <locale>` override wins, then the sender's Telegram client
|
|
350
|
+
language, then the last supported Telegram locale seen for that chat, then
|
|
351
|
+
English.
|
|
352
|
+
Supported locales: `en`, `de`, `fr`, `es`, `pt`, `ru`, `zh`, `ja`, `hi`, `uz`,
|
|
353
|
+
`ka`, `uk`. Bare `/language` opens a single-message inline picker with each language
|
|
354
|
+
shown by its own name (endonym), sorted A→Z by English name, and a `🌐 Auto` button
|
|
355
|
+
(all 12 fit at once — no pagination). Tapping a language (or `🌐 Auto`) applies it, then the menu
|
|
356
|
+
disappears and a short confirmation stays in the chosen language;
|
|
357
|
+
`/language auto` returns a DM/group to automatic selection.
|
|
358
|
+
|
|
359
|
+
#### Advanced (Telegram)
|
|
360
|
+
|
|
361
|
+
| Variable | Default | Set only when |
|
|
362
|
+
|---|---|---|
|
|
363
|
+
| `OPENAI_API_KEY` | — | You intentionally use OpenAI Whisper as the voice fallback instead of Groq |
|
|
364
|
+
| `SHELL` | `/bin/bash` | You want `/terminal` to open a different shell than your login shell (host env var, not set by the bot) |
|
|
365
|
+
|
|
366
|
+
## Jira setup
|
|
367
|
+
|
|
368
|
+
A Jira instance runs on its own — a `DATA_DIR`, a work root, a private tmux server and one env file. How the
|
|
369
|
+
connector behaves is described in [`src/connectors/jira/README.md`](src/connectors/jira/README.md).
|
|
370
|
+
|
|
371
|
+
1. Create a Jira account for the AI (its API token is the instance's only secret) and note its account id.
|
|
372
|
+
2. Recommended: create or choose a Jira group of the people whose words may steer the AI (for example
|
|
373
|
+
`ai-trusted`), and give the AI account the *Browse users and groups* global permission so that it can read
|
|
374
|
+
the group. Then the agent reads only the text and files of its members and of Jira's apps and automations,
|
|
375
|
+
and only their hand-overs start it.
|
|
376
|
+
3. An instance of its own: a `DATA_DIR`, a `WORK_ROOT` with one folder per project, a private tmux server, and
|
|
377
|
+
an env file that is the ONLY configuration it reads:
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
# /path/to/jira-instance.env
|
|
381
|
+
CONNECTORS=jira
|
|
382
|
+
DATA_DIR=/path/to/jira-instance/data
|
|
383
|
+
WORK_ROOT=/path/to/jira-instance/work
|
|
384
|
+
TMUX_SOCKET_NAME=jira-instance
|
|
385
|
+
OPENCODE_URL=http://localhost:4097 # a port of its own — the default 4096 is refused (other instances use it)
|
|
386
|
+
JIRA_AI_API_TOKEN=... # referenced by jira.json below, never written there
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
4. `DATA_DIR/jira.json` — the allowlist, the trusted group and the credentials (`${VAR}` expands from the env file; an unknown
|
|
390
|
+
key is an error):
|
|
391
|
+
|
|
392
|
+
```json
|
|
393
|
+
{
|
|
394
|
+
"site": "example.atlassian.net",
|
|
395
|
+
"email": "ai-account@example.com",
|
|
396
|
+
"apiToken": "${JIRA_AI_API_TOKEN}",
|
|
397
|
+
"accountId": "<the AI account's id>",
|
|
398
|
+
"projects": {
|
|
399
|
+
"PROJ": { "folder": "proj", "triggerStatuses": ["In Progress"], "extraFields": ["customfield_10042"] }
|
|
400
|
+
},
|
|
401
|
+
"trustedGroup": "ai-trusted",
|
|
402
|
+
"wakeOnMention": true,
|
|
403
|
+
"pollIntervalSeconds": 30,
|
|
404
|
+
"runBudgetPer24h": 5,
|
|
405
|
+
"model": "opus",
|
|
406
|
+
"effort": "high"
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
`trustedGroup` (optional, but without it everyone who can edit or comment steers the agent) is the group's
|
|
411
|
+
NAME — one group per instance; a team with several trust circles runs a second instance. The instance
|
|
412
|
+
resolves it to the group's id at start, so renaming the group while it runs keeps working, and reads its
|
|
413
|
+
members again whenever its last read is older than 5 minutes: a removed member loses the AI's trust within
|
|
414
|
+
that time. List only projects where only your team can write, and where no automation acts on text or
|
|
415
|
+
actions from outside it — an e-mail handler, a portal form, a copy from another project, a rule that
|
|
416
|
+
hands an issue to the AI when someone outside the team acts: an app's or automation's text and hand-over
|
|
417
|
+
are trusted, so such a rule brings that outside text, or that person's hand-over, to the agent. Nor list a
|
|
418
|
+
project where anyone outside the team holds the *Edit all comments* permission: Jira Cloud keeps no history
|
|
419
|
+
of a comment's edits, so a comment is judged by its author and its LAST editor only — an outsider's edit of a
|
|
420
|
+
member's comment, followed by a member's own edit, reads as trusted.
|
|
421
|
+
|
|
422
|
+
`wakeOnMention` (optional) decides whether an @-mention of the AI account in a comment wakes it to answer
|
|
423
|
+
only, without the issue being handed over; absent, it is on exactly when `trustedGroup` is set, and `true`
|
|
424
|
+
without a group is refused — without one, anyone who can comment could start the AI.
|
|
425
|
+
|
|
426
|
+
`projects` maps each served project key to its folder under `WORK_ROOT` and the status names in which an
|
|
427
|
+
assigned issue is a request; the agent loads that folder's project memory (`CLAUDE.md`, `.claude/`, … in it
|
|
428
|
+
and in every parent) like any Claude Code session, while your user-level Claude setup stays out of its
|
|
429
|
+
sessions — except that for a folder under HOME that walk reads `~/.claude/CLAUDE.md` back in.
|
|
430
|
+
`pollIntervalSeconds` is 10–600 (default 30);
|
|
431
|
+
`runBudgetPer24h` defaults to 5; `model` and `effort` set the sessions' Claude model and reasoning effort
|
|
432
|
+
(optional; absent → `opus` and `high`, either key overrides only its own default). `extraFields` (optional,
|
|
433
|
+
none by default) names fields by id (`customfield_…`, or a system one like `duedate`) the agent should see next to the standard
|
|
434
|
+
ones, shown under their site name; an id the site does not list is logged at start and left out. `agentBinaries` (optional, host runtime) maps a tool name to the absolute path of an executable — for
|
|
435
|
+
example `{ "ffmpeg": "/opt/tools/ffmpeg" }` — which is checked at start and put on the agents' PATH. `adapter` is `claude-json-stream` (the default — the agent process is stopped when an issue
|
|
436
|
+
idles) or `claude-per-turn` (stopped after every answer); either way the issue's conversation sleeps between
|
|
437
|
+
requests and the next request resumes it.
|
|
438
|
+
|
|
439
|
+
5. Start it with a clean environment, so nothing of the calling shell reaches it:
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
env -i HOME="$HOME" PATH="$PATH" LANG=C.UTF-8 ENV_FILE=/path/to/jira-instance.env charness
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
(In a checkout, `scripts/run-isolated.sh /path/to/jira-instance.env` does the same.)
|
|
446
|
+
|
|
447
|
+
The start refuses a missing `ENV_FILE`, `TMUX_SOCKET_NAME` or `jira.json`, an `OPENCODE_URL` on the default
|
|
448
|
+
port, a `TELEGRAM_BOT_TOKEN` or any `ATLASSIAN_*` variable when Telegram is off, a token that belongs to
|
|
449
|
+
another account, an unknown project or status, a `trustedGroup` the site does not have or the AI account
|
|
450
|
+
may not read, and a `DATA_DIR` holding another surface's state. An unreachable Jira does not refuse the start —
|
|
451
|
+
polling backs off and resumes.
|
|
452
|
+
|
|
453
|
+
The agent sessions of a Jira instance run without the user-level Claude settings, hooks and skills, with the
|
|
454
|
+
bot's MCP server only, without the native question tool, and with an environment reduced to a short allowlist
|
|
455
|
+
— the Jira token is not in the agent's environment. The agent still runs as the instance's OS user and can read
|
|
456
|
+
the instance's env file and `DATA_DIR`, so run the instance under an OS user that holds nothing else, with an AI
|
|
457
|
+
account that sees only the allowlisted projects. **A production Jira account runs only in the Docker container**
|
|
458
|
+
([Run with Docker](#run-with-docker)): there the agent can still read the instance's env file and `DATA_DIR`,
|
|
459
|
+
but nothing of the host outside the container's mounts. Module details: `src/connectors/jira/README.md`.
|
|
460
|
+
|
|
461
|
+
## Alternatives
|
|
462
|
+
|
|
463
|
+
The npm install above is the way to run Charness; this is the alternative to it.
|
|
464
|
+
|
|
465
|
+
### Run with Docker
|
|
466
|
+
|
|
467
|
+
Choose this over the npm install for **isolation** — the agents reach only the folders you mount — or for **a ready
|
|
468
|
+
environment**: the image brings Node 22, tmux, git and ffmpeg, and the bot installs Claude Code and OpenCode the first
|
|
469
|
+
time it starts each, so the host needs only Docker and a clone of this repository.
|
|
470
|
+
|
|
471
|
+
The whole bot runs in one container: the bot itself, tmux, every agent it starts (Claude Code in any backend,
|
|
472
|
+
`/terminal`, OpenCode and its server) and the bot's MCP server. Everything works as on a host; the host only
|
|
473
|
+
lends the container the folders it mounts, so the bot and its agents see nothing else of the machine.
|
|
474
|
+
|
|
475
|
+
```
|
|
476
|
+
host container charness-<instance>
|
|
477
|
+
your instance env file (tokens) ── ro ──▶ the bot (hot mode) + a restart loop
|
|
478
|
+
DATA_DIR, WORK_ROOT ──────▶ tmux, the agents, OpenCode, the bot MCP
|
|
479
|
+
a clone of this repository ──────▶ /opt/charness
|
|
480
|
+
the agents' home folder ──────▶ /home/charness: their Claude / OpenCode
|
|
481
|
+
login, sessions and CLI installs
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
1. **Image and checkout.** Clone the repository for the container (a full clone of its own, not a worktree and
|
|
485
|
+
not the checkout a host instance runs from) and build the image from it:
|
|
486
|
+
|
|
487
|
+
```bash
|
|
488
|
+
git clone https://github.com/olosegres/charness /srv/charness/checkout
|
|
489
|
+
cd /srv/charness/checkout && docker build -t charness -f docker/Dockerfile .
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
The image holds only system tools (tmux, git, ffmpeg, ripgrep, …) and the yarn the checkout's `package.json`
|
|
493
|
+
names (build from the checkout's root, which is how the build reads it; rebuild after a yarn bump so no
|
|
494
|
+
container has to download it). On first start the container installs the checkout's dependencies for the
|
|
495
|
+
image and builds it; the bot installs Claude Code and OpenCode into the agents' home.
|
|
496
|
+
2. **Instance env file**, as for a host install (`TELEGRAM_BOT_TOKEN`, `DATA_DIR`, `WORK_ROOT`, …). It stays on
|
|
497
|
+
the host and is mounted read-only. Every host path it names (`DATA_DIR`, `WORK_ROOT`, `TMUX_TMPDIR`, …) is
|
|
498
|
+
mounted at the SAME path, so `state.json`, sessions and file paths stay valid inside and an instance can move
|
|
499
|
+
between host and container unchanged.
|
|
500
|
+
3. **Run** (or use `examples/docker-compose.yml`):
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
docker run -d --name charness-main --hostname charness-main \
|
|
504
|
+
--restart unless-stopped --stop-timeout 60 \
|
|
505
|
+
-v /srv/charness/checkout:/opt/charness \
|
|
506
|
+
-v /srv/charness/home:/home/charness \
|
|
507
|
+
-v /srv/charness/data:/srv/charness/data \
|
|
508
|
+
-v /srv/projects:/srv/projects \
|
|
509
|
+
-v /srv/charness/instance.env:/srv/charness/instance.env:ro \
|
|
510
|
+
-e ENV_FILE=/srv/charness/instance.env \
|
|
511
|
+
charness
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
No port is published: Telegram is long polling, and the bot's MCP server and the OpenCode server listen on the
|
|
515
|
+
container's own loopback. Keep the `--hostname` fixed and unique per instance: the instance lock tells its own
|
|
516
|
+
restarted container from another machine by it.
|
|
517
|
+
4. **Log the agents in once**, with the account the agents should use (a separate one is best):
|
|
518
|
+
`docker exec -it charness-main claude`, then `/login` (or `/login` in a topic). OpenCode: `/connect` in a
|
|
519
|
+
topic, or `docker exec -it charness-main opencode auth login`. Never copy your own `~/.claude` login in:
|
|
520
|
+
a second holder of its refresh token can log the first one out. For git, put a `.gitconfig` and an SSH key of
|
|
521
|
+
their own into the agents' home.
|
|
522
|
+
|
|
523
|
+
Running it:
|
|
524
|
+
|
|
525
|
+
- **Restart the bot only** (agents keep running and are adopted): `docker exec charness-main
|
|
526
|
+
charness-restart-bot`. A crashed bot is restarted by the container after 20 s.
|
|
527
|
+
- **Update the bot**: `docker exec charness-main /opt/charness/scripts/self-update.sh` (by hand or from
|
|
528
|
+
a timer on the host); hot mode picks the change up. A change to `src/cli.ts`, `src/cli/hot.ts` or `nodemon.json`
|
|
529
|
+
needs the bot restart above. **Update Claude Code / OpenCode**: they update themselves in the agents' home, or
|
|
530
|
+
`docker exec charness-main npm install -g @anthropic-ai/claude-code` / `… opencode-ai`.
|
|
531
|
+
- **A container restart is a reboot**: every agent process ends; each conversation resumes with its next message.
|
|
532
|
+
- **Rootless Docker** (recommended): the container's root is your user, so everything written on the mounts is
|
|
533
|
+
yours. **Rootful Docker**: add `--user "$(id -u):$(id -g)"` and give that user the agents' home.
|
|
534
|
+
- **Moving a host instance in**: stop it first (the lock refuses a lock written on another host), mount its
|
|
535
|
+
folders at their paths, and copy its conversations' folders from `~/.claude/projects/` into the agents' home
|
|
536
|
+
`.claude/projects/` — without them each conversation starts a fresh session on its next message.
|
|
537
|
+
- **What the agents can read**: everything mounted, the instance env file with its tokens, `DATA_DIR` and the
|
|
538
|
+
checkout included. The container keeps the rest of the host out of reach; running the agents as a second user
|
|
539
|
+
inside the container would close that gap later.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
2
|
import type { AgentAdapter, AgentRuntimeInfo, AgentSession, ClaudeSurveyOption, DisplayPrefsReader, ReattachRecap, RecentTurn, ResumeSessionOptions, SeenWatermark, SeenWatermarkWriter, SendInputOptions, ThreadLocaleReader } from '../types';
|
|
3
3
|
import type { SessionKey } from '../sessionKey';
|
|
4
|
+
import type { ClaudeConfigDirReader } from './claudeConfigDir';
|
|
4
5
|
import { type ToolResultKind } from '../utils/claudeScrapeShapes';
|
|
5
6
|
import { type SerialQueue } from '../utils/serialQueue';
|
|
6
7
|
import { tmuxAsync } from '../utils/tmuxExec';
|
|
@@ -22,6 +23,8 @@ export interface ClaudeSession {
|
|
|
22
23
|
sessionName: string;
|
|
23
24
|
/** UUID we pass via `--session-id` (or, on resume, via `--resume`). */
|
|
24
25
|
claudeSessionId: string;
|
|
26
|
+
/** The `CLAUDE_CONFIG_DIR` the pane's claude runs with (its account profile); `null` = the default profile. */
|
|
27
|
+
configDir: string | null;
|
|
25
28
|
queue: SerialQueue;
|
|
26
29
|
pollTimer: NodeJS.Timeout | null;
|
|
27
30
|
lastContent: string;
|
|
@@ -274,6 +277,12 @@ declare function parseTmuxSessionName(name: string): SessionKey | null;
|
|
|
274
277
|
* in that shell. Rejecting up front keeps the surface tight.
|
|
275
278
|
*/
|
|
276
279
|
export declare function checkIsValidUuid(s: string): boolean;
|
|
280
|
+
/**
|
|
281
|
+
* @description The `env CLAUDE_CONFIG_DIR=<dir>` argv prefix of a pane whose
|
|
282
|
+
* conversation uses a non-default account profile; empty for the default
|
|
283
|
+
* (`utils/claudeProfiles.ts`). Quoted with the rest of the argv by the caller.
|
|
284
|
+
*/
|
|
285
|
+
export declare function buildConfigDirEnvPrefix(configDir: string | null): string[];
|
|
277
286
|
/**
|
|
278
287
|
* @description Pure parser — pulls a `--session-id <uuid>` value out of a
|
|
279
288
|
* claude command line. Lives outside the adapter class so it can be
|
|
@@ -599,7 +608,7 @@ export declare function stripTuiElements(text: string, incomingKind?: ToolResult
|
|
|
599
608
|
* Claude stores per-project transcripts under
|
|
600
609
|
* `~/.claude/projects/<slug>/<sessionUuid>.jsonl`, where the slug is the
|
|
601
610
|
* absolute path with every non-alphanumeric character replaced by `-`
|
|
602
|
-
* (e.g. `/home/user/src/
|
|
611
|
+
* (e.g. `/home/user/src/myProject` → `-home-user-src-myProject`).
|
|
603
612
|
*
|
|
604
613
|
* The slug encoding is undocumented and could drift across Claude versions,
|
|
605
614
|
* so it is used only to *locate* the candidate folder — the authoritative
|
|
@@ -929,6 +938,12 @@ export declare class ClaudeCliAdapter extends EventEmitter implements AgentAdapt
|
|
|
929
938
|
* wired → reads fall back to all-fields-`minimal`.
|
|
930
939
|
*/
|
|
931
940
|
private displayPrefsReader;
|
|
941
|
+
private claudeConfigDirReader;
|
|
942
|
+
setClaudeConfigDirReader(reader: ClaudeConfigDirReader): void;
|
|
943
|
+
/** The config directory the conversation's next pane must start with (its account profile). */
|
|
944
|
+
private resolveConfigDir;
|
|
945
|
+
/** The `CLAUDE_CONFIG_DIR` the live pane runs with (`null` = default profile); `undefined` without a live session. */
|
|
946
|
+
getSessionClaudeConfigDir(key: SessionKey): string | null | undefined;
|
|
932
947
|
/** @description Inject the per-thread display-prefs reader (see the field's JSDoc). */
|
|
933
948
|
setDisplayPrefsReader(reader: DisplayPrefsReader): void;
|
|
934
949
|
/** Per-thread locale reader, injected at boot via `createAdapter.registerThreadLocaleReader`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claudeCliAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/claudeCliAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,OAAO,KAAK,EACV,YAAY,EAEZ,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAElB,aAAa,EACb,UAAU,EAEV,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAYhD,OAAO,EAgBL,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAK3E,OAAO,EACL,SAAS,EAMV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAS3E,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AAMxC;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;;;;OAMG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB,oFAAoF;IACpF,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;OAQG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;OASG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;;OAOG;IACH,cAAc,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACtC,oBAAoB,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC5C,oBAAoB,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC5C;;;;;;;OAOG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,YAAY,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC;;;;;;;;;;OAUG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,+FAA+F;IAC/F,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;OASG;IACH,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;;;;;;OAYG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC;;;;;;;;;OASG;IACH,YAAY,EAAE,iBAAiB,CAAC;IAChC;;;;;;;;OAQG;IACH,YAAY,EAAE,kBAAkB,CAAC;IACjC;;;;;;;OAOG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uFAAuF;IACvF,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC5C;AA4ED,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBxD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQnE;AAUD;;;;;;GAMG;AACH,iBAAS,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,iBAAS,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW1E;AAOD,OAAO,EAAE,SAAS,EAAE,CAAC;AAKrB,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC;AAuB9C;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA+DzD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAkOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAqIzE;AAED,kFAAkF;AAClF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAkCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA2BrE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,sBAAsB,EAAE,MAAM,GAC7B,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,cAAc,GAAG,YAAY,GAAG,eAAe,CAAC;AAE5F;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,GACnB,iBAAiB,EAAE,CAYrB;AAED,kFAAkF;AAClF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,gBAAgB,CAKnB;AAuBD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGjE;AAoFD;;;;;;;;;;GAUG;AACH,UAAU,mBAAmB;IAC3B,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD;;;;;;;;;;;GAWG;AACH,UAAU,0BAA0B;IAClC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,qEAAqE;IACrE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gEAAgE;IAChE,kBAAkB,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAChD;AAgCD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAErE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA4B3E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC3C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,0BAA0B,CA4C7B;AAkND;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAuB7D;AAsBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,cAAc,GAAG,IAAW,GACzC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,CAkInD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,cAAc,GAAG,IAAW,GACzC,MAAM,CAER;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElF;AA6MD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAiBnF;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAwBnE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAqClG;AAcD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D;AAwED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAElG;AASD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAQhE;AA6BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAkBtF;AAWD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAyBlF;AA6DD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQtE;AAUD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOlE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAEV;AAsBD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMtE;AAyBD,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG;IAAE,WAAW,EAAE,OAAO,CAAA;CAAE,CAItF;AAED,qBAAa,gBAAiB,SAAQ,YAAa,YAAW,YAAY;IACxE,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,KAAK,iBAAiB;IAC/B,QAAQ,CAAC,aAAa,QAAQ;IAG9B,QAAQ,CAAC,iBAAiB,QAAQ;IAElC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAyC;IAEzD;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB,CAAmC;IAE7D,uFAAuF;IACvF,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAIvD,iGAAiG;IACjG,OAAO,CAAC,kBAAkB,CAAmC;IAE7D,0FAA0F;IAC1F,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAIvD,+FAA+F;IAC/F,OAAO,CAAC,EAAE;IAIV;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB,CAAoC;IAE/D,wFAAwF;IACxF,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAIzD;2BACuB;IACvB,OAAO,CAAC,oBAAoB;IAI5B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,6BAA6B;IAyBrC;kFAC8E;IAC9E,OAAO,CAAC,eAAe;IAIvB;2DACuD;IACvD,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAkGrB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,qBAAqB;YAMf,mBAAmB;IAuCjC;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAyBpB;;;;;;;;;;;;;;;;;OAiBG;YACW,uBAAuB;IAmDrC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IAWlB,YAAY,CAChB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IA2GhB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAMlC,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAKvC,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAM/B,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAahE;;;;;;OAMG;IACH,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAMpD,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI;IA6E3E;;;;;;;OAOG;IACH,OAAO,CAAC,yBAAyB;IAuBjC,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAcjD,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAYhC,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IAY1D,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAY9B;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAW3B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAYjC;;;;;;;;;;;;;;;;;OAiBG;IACG,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B1D;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAK3C;;;;;;;OAOG;IACH,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAK7C;;;;;;;;;;;OAWG;IACG,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWxE,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAIhD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsBvE;;;;;;;OAOG;IACH,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAKzC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,OAAO,CAAC,wBAAwB;IAQhC;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;IAOnC;;;;;;OAMG;IACG,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAInE,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,GAAE,MAAY,GAAG,MAAM,GAAG,IAAI;IAOlE;;;;OAIG;IACH,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAQ5C,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAI7E;;;;;;;OAOG;IACG,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKhH;;;;;;;;;;;;;OAaG;IACG,gBAAgB,CACpB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,aAAa,GAAG,IAAI,GAC9B,OAAO,CAAC,aAAa,CAAC;IAezB;;;;;;;;;;;;;;;;OAgBG;IACG,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+FvH;;;;;;;;;;;;;;OAcG;IACG,wBAAwB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAY1F;;;;;;;;;;;;;;;;;OAiBG;IACG,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ3E;;;;;;;;;;;;;OAaG;IACG,wBAAwB,CAC5B,GAAG,EAAE,UAAU,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,CAAC;IAgFnB;;;;;;OAMG;IACG,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,MAAM,CAAC,oBAAoB,8BAAwB;IACnD,MAAM,CAAC,oBAAoB,8BAAwB;YAErC,iBAAiB;YAKjB,UAAU;IA0axB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,mBAAmB;IAiE3B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,oBAAoB;CAS7B"}
|
|
1
|
+
{"version":3,"file":"claudeCliAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/claudeCliAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,OAAO,KAAK,EACV,YAAY,EAEZ,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAElB,aAAa,EACb,UAAU,EAEV,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAahD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAgBL,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAK3E,OAAO,EACL,SAAS,EAMV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAS3E,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AAMxC;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,eAAe,EAAE,MAAM,CAAC;IACxB,+GAA+G;IAC/G,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;;;;OAMG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB,oFAAoF;IACpF,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;OAQG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;OASG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;;OAOG;IACH,cAAc,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACtC,oBAAoB,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC5C,oBAAoB,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC5C;;;;;;;OAOG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,YAAY,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC;;;;;;;;;;OAUG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,+FAA+F;IAC/F,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;OASG;IACH,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;;;;;;OAYG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC;;;;;;;;;OASG;IACH,YAAY,EAAE,iBAAiB,CAAC;IAChC;;;;;;;;OAQG;IACH,YAAY,EAAE,kBAAkB,CAAC;IACjC;;;;;;;OAOG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uFAAuF;IACvF,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC5C;AA4ED,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBxD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQnE;AAUD;;;;;;GAMG;AACH,iBAAS,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,iBAAS,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAE1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW1E;AAOD,OAAO,EAAE,SAAS,EAAE,CAAC;AAKrB,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC;AAuB9C;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA+DzD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAkOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAqIzE;AAED,kFAAkF;AAClF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAkCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA2BrE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,sBAAsB,EAAE,MAAM,GAC7B,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,cAAc,GAAG,YAAY,GAAG,eAAe,CAAC;AAE5F;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,GACnB,iBAAiB,EAAE,CAYrB;AAED,kFAAkF;AAClF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,gBAAgB,CAKnB;AAuBD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGjE;AAoFD;;;;;;;;;;GAUG;AACH,UAAU,mBAAmB;IAC3B,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD;;;;;;;;;;;GAWG;AACH,UAAU,0BAA0B;IAClC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,qEAAqE;IACrE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gEAAgE;IAChE,kBAAkB,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAChD;AAgCD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAErE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA4B3E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC3C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,0BAA0B,CA4C7B;AAkND;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAuB7D;AAsBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,cAAc,GAAG,IAAW,GACzC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,CAkInD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,cAAc,GAAG,IAAW,GACzC,MAAM,CAER;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElF;AA6MD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAiBnF;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAwBnE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAqClG;AAcD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D;AAwED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAElG;AASD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAQhE;AA6BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAkBtF;AAWD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAyBlF;AA6DD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQtE;AAUD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOlE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAEV;AAsBD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMtE;AAyBD,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG;IAAE,WAAW,EAAE,OAAO,CAAA;CAAE,CAItF;AAED,qBAAa,gBAAiB,SAAQ,YAAa,YAAW,YAAY;IACxE,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,KAAK,iBAAiB;IAC/B,QAAQ,CAAC,aAAa,QAAQ;IAG9B,QAAQ,CAAC,iBAAiB,QAAQ;IAElC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAyC;IAEzD;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,qBAAqB,CAAsC;IAEnE,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI;IAI7D,+FAA+F;IAC/F,OAAO,CAAC,gBAAgB;IAIxB,sHAAsH;IACtH,yBAAyB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS;IAKrE,uFAAuF;IACvF,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAIvD,iGAAiG;IACjG,OAAO,CAAC,kBAAkB,CAAmC;IAE7D,0FAA0F;IAC1F,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAIvD,+FAA+F;IAC/F,OAAO,CAAC,EAAE;IAIV;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB,CAAoC;IAE/D,wFAAwF;IACxF,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAIzD;2BACuB;IACvB,OAAO,CAAC,oBAAoB;IAI5B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,6BAA6B;IAyBrC;kFAC8E;IAC9E,OAAO,CAAC,eAAe;IAIvB;2DACuD;IACvD,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAkGrB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,qBAAqB;YAMf,mBAAmB;IAuCjC;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAyBpB;;;;;;;;;;;;;;;;;OAiBG;YACW,uBAAuB;IAmDrC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IAWlB,YAAY,CAChB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAgHhB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAMlC,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAKvC,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAM/B,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAahE;;;;;;OAMG;IACH,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAMpD,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI;IA6E3E;;;;;;;OAOG;IACH,OAAO,CAAC,yBAAyB;IAuBjC,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAcjD,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAYhC,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IAY1D,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAY9B;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAW3B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAYjC;;;;;;;;;;;;;;;;;OAiBG;IACG,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B1D;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAK3C;;;;;;;OAOG;IACH,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAK7C;;;;;;;;;;;OAWG;IACG,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWxE,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAIhD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsBvE;;;;;;;OAOG;IACH,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAKzC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,OAAO,CAAC,wBAAwB;IAQhC;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;IAOnC;;;;;;OAMG;IACG,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAInE,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,GAAE,MAAY,GAAG,MAAM,GAAG,IAAI;IAOlE;;;;OAIG;IACH,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAQ5C,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAI7E;;;;;;;OAOG;IACG,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKhH;;;;;;;;;;;;;OAaG;IACG,gBAAgB,CACpB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,aAAa,GAAG,IAAI,GAC9B,OAAO,CAAC,aAAa,CAAC;IAezB;;;;;;;;;;;;;;;;OAgBG;IACG,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkGvH;;;;;;;;;;;;;;OAcG;IACG,wBAAwB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAY1F;;;;;;;;;;;;;;;;;OAiBG;IACG,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ3E;;;;;;;;;;;;;OAaG;IACG,wBAAwB,CAC5B,GAAG,EAAE,UAAU,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,CAAC;IAoFnB;;;;;;OAMG;IACG,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,MAAM,CAAC,oBAAoB,8BAAwB;IACnD,MAAM,CAAC,oBAAoB,8BAAwB;YAErC,iBAAiB;YAKjB,UAAU;IA0axB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,mBAAmB;IAiE3B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,oBAAoB;CAS7B"}
|