charness 3.0.0 → 3.1.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/README.md +188 -16
- package/dist/adapters/claudeCliAdapter.d.ts +15 -0
- package/dist/adapters/claudeCliAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeCliAdapter.js +36 -1
- 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 +89 -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 +84 -1
- 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 +639 -24
- package/dist/bot.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.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/connectors/jira/adf.d.ts +2 -0
- package/dist/connectors/jira/adf.d.ts.map +1 -1
- package/dist/connectors/jira/adf.js +5 -0
- package/dist/connectors/jira/adf.js.map +1 -1
- package/dist/connectors/jira/answerSink.d.ts +7 -0
- package/dist/connectors/jira/answerSink.d.ts.map +1 -1
- package/dist/connectors/jira/answerSink.js +24 -10
- 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 +32 -0
- package/dist/connectors/jira/client.d.ts.map +1 -1
- package/dist/connectors/jira/client.js +43 -5
- package/dist/connectors/jira/client.js.map +1 -1
- package/dist/connectors/jira/config.d.ts +3 -16
- package/dist/connectors/jira/config.d.ts.map +1 -1
- package/dist/connectors/jira/config.js +5 -32
- package/dist/connectors/jira/config.js.map +1 -1
- package/dist/connectors/jira/connector.d.ts +3 -0
- package/dist/connectors/jira/connector.d.ts.map +1 -1
- package/dist/connectors/jira/connector.js +70 -15
- package/dist/connectors/jira/connector.js.map +1 -1
- package/dist/connectors/jira/contextLedger.d.ts +1 -0
- package/dist/connectors/jira/contextLedger.d.ts.map +1 -1
- package/dist/connectors/jira/contextLedger.js +2 -0
- package/dist/connectors/jira/contextLedger.js.map +1 -1
- package/dist/connectors/jira/inbound.d.ts +15 -6
- package/dist/connectors/jira/inbound.d.ts.map +1 -1
- package/dist/connectors/jira/inbound.js +37 -22
- package/dist/connectors/jira/inbound.js.map +1 -1
- package/dist/connectors/jira/issueBlocks.d.ts +26 -3
- package/dist/connectors/jira/issueBlocks.d.ts.map +1 -1
- package/dist/connectors/jira/issueBlocks.js +104 -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 +2 -0
- package/dist/connectors/jira/prompt.d.ts.map +1 -1
- package/dist/connectors/jira/prompt.js +4 -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 +4 -0
- package/dist/connectors/jira/trigger.d.ts.map +1 -1
- package/dist/connectors/jira/trigger.js +9 -1
- package/dist/connectors/jira/trigger.js.map +1 -1
- package/dist/connectors/jira/triggerLog.d.ts +4 -2
- package/dist/connectors/jira/triggerLog.d.ts.map +1 -1
- package/dist/connectors/jira/triggerLog.js +1 -1
- 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/scheduler/mcpSurface.d.ts +8 -0
- package/dist/scheduler/mcpSurface.d.ts.map +1 -1
- package/dist/scheduler/mcpSurface.js +42 -2
- package/dist/scheduler/mcpSurface.js.map +1 -1
- package/dist/state.d.ts +172 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +298 -0
- 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 +117 -0
- package/dist/utils/claudeProfiles.d.ts.map +1 -0
- package/dist/utils/claudeProfiles.js +285 -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/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/package.json +1 -1
|
@@ -67,6 +67,7 @@ exports.getJsonStreamSessionPaths = getJsonStreamSessionPaths;
|
|
|
67
67
|
exports.buildJsonStreamTmuxSessionName = buildJsonStreamTmuxSessionName;
|
|
68
68
|
exports.parseJsonStreamTmuxSessionName = parseJsonStreamTmuxSessionName;
|
|
69
69
|
exports.buildWrapperScript = buildWrapperScript;
|
|
70
|
+
exports.readWrapperScriptConfigDir = readWrapperScriptConfigDir;
|
|
70
71
|
exports.openFifoWriterNonBlocking = openFifoWriterNonBlocking;
|
|
71
72
|
exports.writeFifoText = writeFifoText;
|
|
72
73
|
exports.readPidFile = readPidFile;
|
|
@@ -89,6 +90,7 @@ const promises_1 = require("timers/promises");
|
|
|
89
90
|
const sessionKey_1 = require("../sessionKey");
|
|
90
91
|
const tmuxSessionName_1 = require("./tmuxSessionName");
|
|
91
92
|
const tmuxExec_1 = require("./tmuxExec");
|
|
93
|
+
const claudeProfiles_1 = require("./claudeProfiles");
|
|
92
94
|
/** Subdirectory of `DATA_DIR` that holds every thread's json-stream host dir. */
|
|
93
95
|
exports.jsonStreamRootDirName = 'jsonstream';
|
|
94
96
|
/** tmux session-name prefix for this backend — distinct from the scrape
|
|
@@ -173,14 +175,20 @@ function parseJsonStreamTmuxSessionName(name) {
|
|
|
173
175
|
* even if the tmux server environment carries a key. With an `environment`
|
|
174
176
|
* (a tracker conversation, R32) claude gets exactly those variables instead —
|
|
175
177
|
* `env -i`, so nothing of the tmux server's environment reaches it (no API key
|
|
176
|
-
* either).
|
|
177
|
-
* (
|
|
178
|
+
* either). A non-default Claude account profile adds `CLAUDE_CONFIG_DIR=<dir>` to
|
|
179
|
+
* either `env` form (`utils/claudeProfiles.ts`); the default profile adds nothing,
|
|
180
|
+
* so the wrapper of a topic that never picked an account is byte-identical to
|
|
181
|
+
* the golden shape. The variable sits in the process environment — not only in
|
|
182
|
+
* the CLI's own reading of it — so a child `claude` the agent starts inherits the
|
|
183
|
+
* same account. All embedded strings are single-quoted; `claudePath` must be
|
|
184
|
+
* ABSOLUTE (tmux server PATH differs).
|
|
178
185
|
*/
|
|
179
|
-
function buildWrapperScript(claudePath, args, workDir, paths, environment = null) {
|
|
186
|
+
function buildWrapperScript(claudePath, args, workDir, paths, environment = null, configDir = null) {
|
|
180
187
|
const command = [claudePath, ...args].map(tmuxExec_1.shellSingleQuote).join(' ');
|
|
188
|
+
const configDirAssignment = configDir === null ? [] : [(0, tmuxExec_1.shellSingleQuote)(`${claudeProfiles_1.claudeConfigDirVariableName}=${configDir}`)];
|
|
181
189
|
const envCommand = environment === null
|
|
182
|
-
? 'env -u ANTHROPIC_API_KEY'
|
|
183
|
-
: ['env', '-i', ...Object.entries(environment).map(([name, value]) => (0, tmuxExec_1.shellSingleQuote)(`${name}=${value}`))].join(' ');
|
|
190
|
+
? ['env', '-u', 'ANTHROPIC_API_KEY', ...configDirAssignment].join(' ')
|
|
191
|
+
: ['env', '-i', ...Object.entries(environment).map(([name, value]) => (0, tmuxExec_1.shellSingleQuote)(`${name}=${value}`)), ...configDirAssignment].join(' ');
|
|
184
192
|
return `#!/bin/sh
|
|
185
193
|
cd ${(0, tmuxExec_1.shellSingleQuote)(workDir)} || exit ${exports.wrapperCdFailExitCode}
|
|
186
194
|
${envCommand} ${command} \\
|
|
@@ -191,6 +199,19 @@ wait $CHILD
|
|
|
191
199
|
echo $? > ${(0, tmuxExec_1.shellSingleQuote)(paths.exitCodeFile)}
|
|
192
200
|
`;
|
|
193
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* @description The `CLAUDE_CONFIG_DIR` a persisted wrapper script starts claude with, `null` for the default
|
|
204
|
+
* profile or an unreadable script. Read at adopt: the running process keeps the account it was spawned with,
|
|
205
|
+
* and the bot compares it with the profile its topic has now.
|
|
206
|
+
*/
|
|
207
|
+
function readWrapperScriptConfigDir(wrapperFile) {
|
|
208
|
+
try {
|
|
209
|
+
return (0, claudeProfiles_1.parseClaudeConfigDirFromCommand)(fs.readFileSync(wrapperFile, 'utf8'));
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
194
215
|
/**
|
|
195
216
|
* @description Open the stdin FIFO for writing WITHOUT ever blocking: a plain
|
|
196
217
|
* `open(O_WRONLY)` on a FIFO with no reader hangs forever (the P1 probe's first
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonStreamHost.js","sourceRoot":"","sources":["../../src/utils/jsonStreamHost.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"jsonStreamHost.js","sourceRoot":"","sources":["../../src/utils/jsonStreamHost.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ModelCatalog } from './modelPickerPlan';
|
|
2
|
+
/**
|
|
3
|
+
* @description How many entries the list keeps. Ten is one keyboard that needs
|
|
4
|
+
* no paging and matches the model level's page size, so the flat list is never
|
|
5
|
+
* taller than a provider page.
|
|
6
|
+
*/
|
|
7
|
+
export declare const recentModelsLimit = 10;
|
|
8
|
+
/** Opens the flat list (provider level → recent level). */
|
|
9
|
+
export declare const recentModelsOpenCallback = "mdlrecent";
|
|
10
|
+
/** Anchored matcher for `bot.action(...)`, kept beside the builder so the wire
|
|
11
|
+
* format has one definition. */
|
|
12
|
+
export declare const recentModelPickCallbackRe: RegExp;
|
|
13
|
+
/**
|
|
14
|
+
* @description Put `modelId` at the head of the list: a repeat pick moves its
|
|
15
|
+
* entry to the front rather than duplicating it, and the oldest entry falls
|
|
16
|
+
* off once `limit` is reached. Never mutates `current`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pushRecentModel(current: readonly string[], modelId: string, limit?: number): string[];
|
|
19
|
+
/**
|
|
20
|
+
* @description The entries the picker may offer: those whose `provider/model`
|
|
21
|
+
* still exists in the live catalog AND whose provider is not hidden.
|
|
22
|
+
*
|
|
23
|
+
* A provider that was disconnected (or a model the server stopped serving)
|
|
24
|
+
* leaves a stale id behind in `state.json`; rendering a button for it would
|
|
25
|
+
* resolve to nothing. The entry stays on disk — the provider may come back —
|
|
26
|
+
* it is just not shown. Hidden providers are excluded for the same reason
|
|
27
|
+
* they are excluded one level up: hiding must make a provider unreachable
|
|
28
|
+
* through the picker, not just invisible on its own level.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getRecentModelsInCatalog(recentModels: readonly string[], catalog: ModelCatalog): string[];
|
|
31
|
+
/**
|
|
32
|
+
* @description Short identity of a model id that fits the callback budget:
|
|
33
|
+
* the first 8 hex chars of its SHA-256. The full id (`openrouter/anthropic/
|
|
34
|
+
* claude-sonnet-4.5`) cannot ride in `callback_data` (64 bytes), and an index
|
|
35
|
+
* alone would re-point an old keyboard at a DIFFERENT model once the list is
|
|
36
|
+
* reordered by a newer pick — so the button carries both.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getRecentModelIdentity(modelId: string): string;
|
|
39
|
+
export declare function buildRecentModelPickCallback(index: number, modelId: string): string;
|
|
40
|
+
/** A position in the list paired with the identity of the entry shown there. */
|
|
41
|
+
export interface RecentModelPickRef {
|
|
42
|
+
index: number;
|
|
43
|
+
identity: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function parseRecentModelPickCallback(callbackData: string): RecentModelPickRef | null;
|
|
46
|
+
/**
|
|
47
|
+
* @description Resolve a tapped recent-list button against the list AS IT IS
|
|
48
|
+
* NOW. The index is only a hint: it is trusted when the entry there still has
|
|
49
|
+
* the identity the button carries; otherwise the list is searched for that
|
|
50
|
+
* identity (a newer pick just moved the entry). `null` — never another
|
|
51
|
+
* model — when the entry left the list (evicted past the cap, or filtered
|
|
52
|
+
* out because its provider is gone or hidden); the caller turns that into
|
|
53
|
+
* the "expired" toast.
|
|
54
|
+
*/
|
|
55
|
+
export declare function getRecentModelPick(recentModels: readonly string[], ref: RecentModelPickRef): string | null;
|
|
56
|
+
//# sourceMappingURL=modelRecentPlan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelRecentPlan.d.ts","sourceRoot":"","sources":["../../src/utils/modelRecentPlan.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,2DAA2D;AAC3D,eAAO,MAAM,wBAAwB,cAAc,CAAC;AAIpD;iCACiC;AACjC,eAAO,MAAM,yBAAyB,QAA+B,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAA0B,GAChC,MAAM,EAAE,CAKV;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,OAAO,EAAE,YAAY,GACpB,MAAM,EAAE,CASV;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAI5F;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,GAAG,EAAE,kBAAkB,GACtB,MAAM,GAAG,IAAI,CAIf"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.recentModelPickCallbackRe = exports.recentModelsOpenCallback = exports.recentModelsLimit = void 0;
|
|
4
|
+
exports.pushRecentModel = pushRecentModel;
|
|
5
|
+
exports.getRecentModelsInCatalog = getRecentModelsInCatalog;
|
|
6
|
+
exports.getRecentModelIdentity = getRecentModelIdentity;
|
|
7
|
+
exports.buildRecentModelPickCallback = buildRecentModelPickCallback;
|
|
8
|
+
exports.parseRecentModelPickCallback = parseRecentModelPickCallback;
|
|
9
|
+
exports.getRecentModelPick = getRecentModelPick;
|
|
10
|
+
/**
|
|
11
|
+
* @description Pure layer behind the "Recently used" shortcut of the `/model`
|
|
12
|
+
* picker: the most-recently-used list itself, its catalog filter, and the
|
|
13
|
+
* callback codec of the flat list it opens.
|
|
14
|
+
*
|
|
15
|
+
* Why it exists: the two-level picker (provider → that provider's models) is
|
|
16
|
+
* what keeps `/model` inside Telegram's message cap, but an operator who hops
|
|
17
|
+
* between a few favourite models of DIFFERENT providers pays the two taps
|
|
18
|
+
* every time. The shortcut sits first on the provider level and opens one
|
|
19
|
+
* flat list of `provider/model` ids that were actually picked before —
|
|
20
|
+
* instance-wide, most recent first, deduplicated, capped.
|
|
21
|
+
*
|
|
22
|
+
* Everything here is pure so `modelProviders.ts` stays wiring and the three
|
|
23
|
+
* rules — update/dedupe/cap, the stale-entry filter, the stale-tap safety of
|
|
24
|
+
* the callbacks — are unit-tested without a Telegram surface.
|
|
25
|
+
*/
|
|
26
|
+
const node_crypto_1 = require("node:crypto");
|
|
27
|
+
/**
|
|
28
|
+
* @description How many entries the list keeps. Ten is one keyboard that needs
|
|
29
|
+
* no paging and matches the model level's page size, so the flat list is never
|
|
30
|
+
* taller than a provider page.
|
|
31
|
+
*/
|
|
32
|
+
exports.recentModelsLimit = 10;
|
|
33
|
+
/** Opens the flat list (provider level → recent level). */
|
|
34
|
+
exports.recentModelsOpenCallback = 'mdlrecent';
|
|
35
|
+
const recentModelPickCallbackPrefix = 'mdlr_';
|
|
36
|
+
/** Anchored matcher for `bot.action(...)`, kept beside the builder so the wire
|
|
37
|
+
* format has one definition. */
|
|
38
|
+
exports.recentModelPickCallbackRe = /^mdlr_(\d+)_([0-9a-f]{8})$/;
|
|
39
|
+
/**
|
|
40
|
+
* @description Put `modelId` at the head of the list: a repeat pick moves its
|
|
41
|
+
* entry to the front rather than duplicating it, and the oldest entry falls
|
|
42
|
+
* off once `limit` is reached. Never mutates `current`.
|
|
43
|
+
*/
|
|
44
|
+
function pushRecentModel(current, modelId, limit = exports.recentModelsLimit) {
|
|
45
|
+
const trimmed = modelId.trim();
|
|
46
|
+
const rest = current.filter((entry) => entry !== trimmed);
|
|
47
|
+
const next = trimmed ? [trimmed, ...rest] : rest;
|
|
48
|
+
return next.slice(0, Math.max(limit, 0));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @description The entries the picker may offer: those whose `provider/model`
|
|
52
|
+
* still exists in the live catalog AND whose provider is not hidden.
|
|
53
|
+
*
|
|
54
|
+
* A provider that was disconnected (or a model the server stopped serving)
|
|
55
|
+
* leaves a stale id behind in `state.json`; rendering a button for it would
|
|
56
|
+
* resolve to nothing. The entry stays on disk — the provider may come back —
|
|
57
|
+
* it is just not shown. Hidden providers are excluded for the same reason
|
|
58
|
+
* they are excluded one level up: hiding must make a provider unreachable
|
|
59
|
+
* through the picker, not just invisible on its own level.
|
|
60
|
+
*/
|
|
61
|
+
function getRecentModelsInCatalog(recentModels, catalog) {
|
|
62
|
+
const hiddenSet = new Set(catalog.hiddenProviders);
|
|
63
|
+
return recentModels.filter((modelId) => {
|
|
64
|
+
const slashIndex = modelId.indexOf('/');
|
|
65
|
+
if (slashIndex <= 0)
|
|
66
|
+
return false;
|
|
67
|
+
const provider = modelId.slice(0, slashIndex);
|
|
68
|
+
if (hiddenSet.has(provider))
|
|
69
|
+
return false;
|
|
70
|
+
return catalog.byProvider.get(provider)?.includes(modelId) ?? false;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @description Short identity of a model id that fits the callback budget:
|
|
75
|
+
* the first 8 hex chars of its SHA-256. The full id (`openrouter/anthropic/
|
|
76
|
+
* claude-sonnet-4.5`) cannot ride in `callback_data` (64 bytes), and an index
|
|
77
|
+
* alone would re-point an old keyboard at a DIFFERENT model once the list is
|
|
78
|
+
* reordered by a newer pick — so the button carries both.
|
|
79
|
+
*/
|
|
80
|
+
function getRecentModelIdentity(modelId) {
|
|
81
|
+
return (0, node_crypto_1.createHash)('sha256').update(modelId, 'utf8').digest('hex').slice(0, 8);
|
|
82
|
+
}
|
|
83
|
+
function buildRecentModelPickCallback(index, modelId) {
|
|
84
|
+
return `${recentModelPickCallbackPrefix}${index}_${getRecentModelIdentity(modelId)}`;
|
|
85
|
+
}
|
|
86
|
+
function parseRecentModelPickCallback(callbackData) {
|
|
87
|
+
const match = exports.recentModelPickCallbackRe.exec(callbackData);
|
|
88
|
+
if (!match)
|
|
89
|
+
return null;
|
|
90
|
+
return { index: Number(match[1]), identity: match[2] };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* @description Resolve a tapped recent-list button against the list AS IT IS
|
|
94
|
+
* NOW. The index is only a hint: it is trusted when the entry there still has
|
|
95
|
+
* the identity the button carries; otherwise the list is searched for that
|
|
96
|
+
* identity (a newer pick just moved the entry). `null` — never another
|
|
97
|
+
* model — when the entry left the list (evicted past the cap, or filtered
|
|
98
|
+
* out because its provider is gone or hidden); the caller turns that into
|
|
99
|
+
* the "expired" toast.
|
|
100
|
+
*/
|
|
101
|
+
function getRecentModelPick(recentModels, ref) {
|
|
102
|
+
const atIndex = recentModels[ref.index];
|
|
103
|
+
if (atIndex !== undefined && getRecentModelIdentity(atIndex) === ref.identity)
|
|
104
|
+
return atIndex;
|
|
105
|
+
return recentModels.find((modelId) => getRecentModelIdentity(modelId) === ref.identity) ?? null;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=modelRecentPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelRecentPlan.js","sourceRoot":"","sources":["../../src/utils/modelRecentPlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
import type { AgentRuntimeInfo } from '../types';
|
|
2
|
+
/** One Claude account profile as `/status` names it. */
|
|
3
|
+
export interface ThreadStatusAccountSource {
|
|
4
|
+
name: string;
|
|
5
|
+
/** What the last `claude auth status` read said; `null` when never probed. */
|
|
6
|
+
email: string | null;
|
|
7
|
+
/** That read's sign-in answer; `undefined` when never probed. A signed-out profile may keep an old email. */
|
|
8
|
+
loggedIn: boolean | undefined;
|
|
9
|
+
/** Raw ISO limit mark of the profile record; a mark in the past reads as no limit. */
|
|
10
|
+
limitedUntil: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface ThreadStatusAccount {
|
|
13
|
+
/** The account the live process runs on — or, with no live process, the one its next start uses. */
|
|
14
|
+
current: ThreadStatusAccountSource;
|
|
15
|
+
/** The account the topic is now set to while the live process still runs on another (a deferred switch). */
|
|
16
|
+
pending: ThreadStatusAccountSource | null;
|
|
17
|
+
nowMs: number;
|
|
18
|
+
}
|
|
2
19
|
export interface ThreadStatusReportInput {
|
|
3
20
|
agentLine: string;
|
|
4
21
|
subdir: string;
|
|
@@ -10,6 +27,11 @@ export interface ThreadStatusReportInput {
|
|
|
10
27
|
effort: string | null;
|
|
11
28
|
startedAt: string | null;
|
|
12
29
|
runtime: AgentRuntimeInfo | null;
|
|
30
|
+
/**
|
|
31
|
+
* The Claude profile the topic's agent runs on; `null`/absent for a topic with no agent or a non-Claude one
|
|
32
|
+
* (an OpenCode model label already names its provider).
|
|
33
|
+
*/
|
|
34
|
+
account?: ThreadStatusAccount | null;
|
|
13
35
|
/** The topic's view, already localized (`verbosity.view.*`). */
|
|
14
36
|
view: string;
|
|
15
37
|
/** Instance timezone, already resolved (stored pick, else the host zone). */
|
|
@@ -27,7 +49,9 @@ export interface ThreadStatusReportInput {
|
|
|
27
49
|
* meaningless once the session stopped, so a stopped thread renders only the
|
|
28
50
|
* header, the bound working directory, the topic's view and the timezone.
|
|
29
51
|
*/
|
|
30
|
-
export declare function getThreadStatusReport({ agentLine, subdir, isActive, isSleeping, workDir, model, effort, startedAt, runtime, view, timezone, timezoneNow, }: ThreadStatusReportInput): string;
|
|
52
|
+
export declare function getThreadStatusReport({ agentLine, subdir, isActive, isSleeping, workDir, model, effort, startedAt, runtime, account, view, timezone, timezoneNow, }: ThreadStatusReportInput): string;
|
|
53
|
+
/** @description The `Account:` row (plus a pending-switch row) of the `/status` report. */
|
|
54
|
+
export declare function formatThreadStatusAccountLines({ current, pending, nowMs }: ThreadStatusAccount, timezone: string): string[];
|
|
31
55
|
export interface ThreadStatusModelSources {
|
|
32
56
|
/** Live model the adapter itself can name right now (`getCurrentModel`). */
|
|
33
57
|
adapterModel: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threadStatusReport.d.ts","sourceRoot":"","sources":["../../src/utils/threadStatusReport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"threadStatusReport.d.ts","sourceRoot":"","sources":["../../src/utils/threadStatusReport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGjD,wDAAwD;AACxD,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,6GAA6G;IAC7G,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,sFAAsF;IACtF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,oGAAoG;IACpG,OAAO,EAAE,yBAAyB,CAAC;IACnC,4GAA4G;IAC5G,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,iGAAiG;IACjG,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,MAAM,EACN,QAAQ,EACR,UAAU,EACV,OAAO,EACP,KAAK,EACL,MAAM,EACN,SAAS,EACT,OAAO,EACP,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,WAAW,GACZ,EAAE,uBAAuB,GAAG,MAAM,CA6BlC;AAcD,2FAA2F;AAC3F,wBAAgB,8BAA8B,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAI3H;AAED,MAAM,WAAW,wBAAwB;IACvC,4EAA4E;IAC5E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,uFAAuF;IACvF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qEAAqE;IACrE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,EAAE,wBAAwB,GAAG,MAAM,GAAG,IAAI,CAE1C"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getThreadStatusReport = getThreadStatusReport;
|
|
4
|
+
exports.formatThreadStatusAccountLines = formatThreadStatusAccountLines;
|
|
4
5
|
exports.getThreadStatusModel = getThreadStatusModel;
|
|
5
6
|
const i18n_1 = require("../i18n");
|
|
7
|
+
const claudeUsage_1 = require("./claudeUsage");
|
|
6
8
|
/**
|
|
7
9
|
* @description Render the per-topic `/status` report. Pure (locale comes from
|
|
8
10
|
* the caller's async i18n context) and kept OUT of `bot.ts` so it is unit-testable
|
|
@@ -13,7 +15,7 @@ const i18n_1 = require("../i18n");
|
|
|
13
15
|
* meaningless once the session stopped, so a stopped thread renders only the
|
|
14
16
|
* header, the bound working directory, the topic's view and the timezone.
|
|
15
17
|
*/
|
|
16
|
-
function getThreadStatusReport({ agentLine, subdir, isActive, isSleeping, workDir, model, effort, startedAt, runtime, view, timezone, timezoneNow, }) {
|
|
18
|
+
function getThreadStatusReport({ agentLine, subdir, isActive, isSleeping, workDir, model, effort, startedAt, runtime, account, view, timezone, timezoneNow, }) {
|
|
17
19
|
const lines = [
|
|
18
20
|
(0, i18n_1.t)('status.thread_report', {
|
|
19
21
|
agent: agentLine,
|
|
@@ -21,6 +23,9 @@ function getThreadStatusReport({ agentLine, subdir, isActive, isSleeping, workDi
|
|
|
21
23
|
session: isActive ? (0, i18n_1.t)('status.thread_running') : isSleeping ? (0, i18n_1.t)('status.thread_sleeping') : (0, i18n_1.t)('status.thread_stopped'),
|
|
22
24
|
}),
|
|
23
25
|
];
|
|
26
|
+
// A topic property like the folder: a stopped Claude topic still names the profile its next start uses.
|
|
27
|
+
if (account)
|
|
28
|
+
lines.push(...formatThreadStatusAccountLines(account, timezone));
|
|
24
29
|
if (workDir !== null)
|
|
25
30
|
lines.push((0, i18n_1.t)('status.thread_workdir', { workDir }));
|
|
26
31
|
// A topic property, not a session one (S6): named whether or not an agent runs.
|
|
@@ -44,6 +49,24 @@ function getThreadStatusReport({ agentLine, subdir, isActive, isSleeping, workDi
|
|
|
44
49
|
}));
|
|
45
50
|
return lines.join('\n');
|
|
46
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* @description `name · email` like an `/accounts` row (`name · not signed in` once a probe said so, the name
|
|
54
|
+
* alone when never probed), plus the `/accounts` limit mark while it lies in the future, reset in the instance zone.
|
|
55
|
+
*/
|
|
56
|
+
function formatAccount({ name, email, loggedIn, limitedUntil }, timezone, nowMs) {
|
|
57
|
+
const detail = loggedIn === false ? (0, i18n_1.t)('account.row.loggedOut') : email;
|
|
58
|
+
const limited = limitedUntil !== null && Date.parse(limitedUntil) > nowMs
|
|
59
|
+
? (0, i18n_1.t)('status.thread_account_limited', { until: (0, claudeUsage_1.formatClaudeUsageResetAt)(limitedUntil, timezone, nowMs) })
|
|
60
|
+
: '';
|
|
61
|
+
return `${detail ? `${name} · ${detail}` : name}${limited}`;
|
|
62
|
+
}
|
|
63
|
+
/** @description The `Account:` row (plus a pending-switch row) of the `/status` report. */
|
|
64
|
+
function formatThreadStatusAccountLines({ current, pending, nowMs }, timezone) {
|
|
65
|
+
const lines = [(0, i18n_1.t)('status.thread_account', { account: formatAccount(current, timezone, nowMs) })];
|
|
66
|
+
if (pending !== null)
|
|
67
|
+
lines.push((0, i18n_1.t)('status.thread_account_pending', { account: formatAccount(pending, timezone, nowMs) }));
|
|
68
|
+
return lines;
|
|
69
|
+
}
|
|
47
70
|
/**
|
|
48
71
|
* @description Resolve the model `/status` names for a live session, most
|
|
49
72
|
* authoritative source first.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threadStatusReport.js","sourceRoot":"","sources":["../../src/utils/threadStatusReport.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"threadStatusReport.js","sourceRoot":"","sources":["../../src/utils/threadStatusReport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "charness",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Sergei Solo",
|
|
6
6
|
"description": "Charness (formerly TelegramCode): Telegram forum-supergroup bot for Claude Code / OpenCode — one topic per task, isolated sessions, per-thread MCP",
|