switchroom 0.18.20 → 0.18.22
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/dist/cli/switchroom.js +24 -1
- package/dist/host-control/main.js +1 -1
- package/package.json +1 -1
- package/profiles/_shared/delegation-golden-rule.md.hbs +9 -0
- package/profiles/_shared/dev-protocol.md.hbs +2 -0
- package/profiles/_shared/execution-discipline.md.hbs +2 -2
- package/profiles/coding/CLAUDE.md.hbs +1 -1
- package/telegram-plugin/dist/gateway/gateway.js +268 -61
- package/telegram-plugin/flushed-turn-supersede.ts +230 -0
- package/telegram-plugin/gateway/gateway.ts +88 -1
- package/telegram-plugin/gateway/subagent-progress-inbound-builder.ts +17 -0
- package/telegram-plugin/registry/subagents-schema.ts +6 -0
- package/telegram-plugin/subagent-watcher.ts +86 -1
- package/telegram-plugin/tests/flushed-turn-supersede.test.ts +206 -0
- package/telegram-plugin/tests/nested-worker-visibility-harness.test.ts +20 -0
- package/telegram-plugin/tests/subagent-progress-inbound-builder.test.ts +30 -0
- package/telegram-plugin/tests/subagent-watcher-first-paint-independence.test.ts +171 -0
- package/telegram-plugin/tests/subagent-watcher-narrative-early-paint.test.ts +7 -5
- package/telegram-plugin/tests/subagent-watcher.test.ts +13 -12
- package/telegram-plugin/tests/turn-flush-safety.test.ts +71 -0
- package/telegram-plugin/tests/worker-activity-feed.test.ts +13 -8
- package/telegram-plugin/tests/worker-feed-coalesce.test.ts +196 -0
- package/telegram-plugin/tests/worker-feed-terminal-state-truthful.test.ts +40 -0
- package/telegram-plugin/turn-flush-safety.ts +74 -1
- package/telegram-plugin/worker-activity-feed.ts +155 -45
package/dist/cli/switchroom.js
CHANGED
|
@@ -2120,7 +2120,7 @@ var init_esm = __esm(() => {
|
|
|
2120
2120
|
});
|
|
2121
2121
|
|
|
2122
2122
|
// src/build-info.ts
|
|
2123
|
-
var VERSION = "0.18.
|
|
2123
|
+
var VERSION = "0.18.22", COMMIT_SHA = "5da23264";
|
|
2124
2124
|
|
|
2125
2125
|
// src/cli/resolve-version.ts
|
|
2126
2126
|
import { existsSync, readFileSync } from "node:fs";
|
|
@@ -23799,6 +23799,14 @@ function renderDevProtocolFragment(context = {}, profilesRoot = PROFILES_ROOT) {
|
|
|
23799
23799
|
const template = import_handlebars.default.compile(source, { noEscape: true });
|
|
23800
23800
|
return template(context).trimEnd();
|
|
23801
23801
|
}
|
|
23802
|
+
function renderDelegationGoldenRuleFragment(context = {}, profilesRoot = PROFILES_ROOT) {
|
|
23803
|
+
const fragPath = join4(resolve4(profilesRoot, "_shared"), "delegation-golden-rule.md.hbs");
|
|
23804
|
+
if (!existsSync7(fragPath))
|
|
23805
|
+
return "";
|
|
23806
|
+
const source = readFileSync7(fragPath, "utf-8");
|
|
23807
|
+
const template = import_handlebars.default.compile(source, { noEscape: true });
|
|
23808
|
+
return template(context).trimEnd();
|
|
23809
|
+
}
|
|
23802
23810
|
function renderReplyDisciplineFragment(context = {}, profilesRoot = PROFILES_ROOT) {
|
|
23803
23811
|
const fragPath = join4(resolve4(profilesRoot, "_shared"), "reply-discipline.md.hbs");
|
|
23804
23812
|
if (!existsSync7(fragPath))
|
|
@@ -27579,6 +27587,13 @@ function scaffoldAgent(name, agentConfigRaw, agentsDir, telegramConfig, switchro
|
|
|
27579
27587
|
rendered = rendered.trimEnd() + `
|
|
27580
27588
|
|
|
27581
27589
|
` + devProtocol + `
|
|
27590
|
+
`;
|
|
27591
|
+
}
|
|
27592
|
+
const delegationGoldenRule = renderDelegationGoldenRuleFragment(context);
|
|
27593
|
+
if (delegationGoldenRule) {
|
|
27594
|
+
rendered = rendered.trimEnd() + `
|
|
27595
|
+
|
|
27596
|
+
` + delegationGoldenRule + `
|
|
27582
27597
|
`;
|
|
27583
27598
|
}
|
|
27584
27599
|
}
|
|
@@ -28462,6 +28477,13 @@ ${baseAppend}` : TELEGRAM_FORMATTING_FLOOR_CARD;
|
|
|
28462
28477
|
rendered = rendered.trimEnd() + `
|
|
28463
28478
|
|
|
28464
28479
|
` + devProtocol + `
|
|
28480
|
+
`;
|
|
28481
|
+
}
|
|
28482
|
+
const delegationGoldenRule = renderDelegationGoldenRuleFragment(claudeContext);
|
|
28483
|
+
if (delegationGoldenRule) {
|
|
28484
|
+
rendered = rendered.trimEnd() + `
|
|
28485
|
+
|
|
28486
|
+
` + delegationGoldenRule + `
|
|
28465
28487
|
`;
|
|
28466
28488
|
}
|
|
28467
28489
|
if (agentConfig.claude_md_raw) {
|
|
@@ -78779,6 +78801,7 @@ function applySubagentsSchema(db) {
|
|
|
78779
78801
|
db.exec("ALTER TABLE subagents ADD COLUMN model TEXT");
|
|
78780
78802
|
}
|
|
78781
78803
|
db.exec("CREATE INDEX IF NOT EXISTS subagents_jsonl_id ON subagents(jsonl_agent_id)");
|
|
78804
|
+
db.exec("CREATE INDEX IF NOT EXISTS subagents_parent_agent ON subagents(parent_agent_id)");
|
|
78782
78805
|
}
|
|
78783
78806
|
function mapSubagentRow(row) {
|
|
78784
78807
|
return {
|
|
@@ -26605,7 +26605,7 @@ import { existsSync as existsSync9, readFileSync as readFileSync7 } from "node:f
|
|
|
26605
26605
|
import { dirname as dirname4, join as join7 } from "node:path";
|
|
26606
26606
|
|
|
26607
26607
|
// src/build-info.ts
|
|
26608
|
-
var VERSION = "0.18.
|
|
26608
|
+
var VERSION = "0.18.22";
|
|
26609
26609
|
|
|
26610
26610
|
// src/cli/resolve-version.ts
|
|
26611
26611
|
function readPackageVersion() {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "switchroom",
|
|
3
3
|
"//version": "NOT the release version — source of truth is the git tag, resolved by scripts/build.mjs:resolveVersion() (see CLAUDE.md > Standard release process). This field is stale by design and only the Layer-4 dev/non-tag fallback for build.mjs + src/cli/resolve-version.ts; do NOT bump it expecting a release to pick it up. npm-pack tarball naming needs a real version — do that as an UNCOMMITTED pack-time bump (see release step 6), never a committed one.",
|
|
4
|
-
"version": "0.18.
|
|
4
|
+
"version": "0.18.22",
|
|
5
5
|
"description": "Run Claude Code 24/7 on your Claude Pro/Max subscription over Telegram. Open-source alternative to OpenClaw and NanoClaw — no API keys.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## Delegation — the last word
|
|
2
|
+
|
|
3
|
+
This is the tail reminder on purpose: whatever the grounding, execution-bias, and development-protocol guidance above told you to *do*, the default way to do execution-class work is to **delegate it, not to run it inline.**
|
|
4
|
+
|
|
5
|
+
- **Golden rule: when in doubt, delegate.** Any code change, research spanning 3+ file reads, file/report generation, build/deploy, or a task needing 3+ sequential tool calls without user input goes to a sub-agent (`@worker` for changes, `@researcher` for research, `@reviewer` for review) — per the Sub-Agent Delegation section. Unnecessary delegation costs a few tokens; a blocked foreground session costs the user's attention.
|
|
6
|
+
- **The main session is for conversation.** Keep your own turns short — dispatch and acknowledge. The user should never wait more than 10 seconds for a response. "Act in-turn" is satisfied by dispatching the worker, not by doing the work yourself.
|
|
7
|
+
- **Anti-pattern:** starting a task inline "because it's almost done", then racking up 5+ tool calls in the foreground. If it's execution-class, hand it off at the first tool call, not the fifth.
|
|
8
|
+
|
|
9
|
+
If no sub-agents are configured, do the work yourself.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
How development work gets done here — orient, clarify, align, ship, communicate. These are procedural rules for any substantive coding, infra, or debugging task. For the long-form playbook (design reports, adversarial review structure, re-review verdicts), load the bundled `dev-protocol` skill before starting substantive development work.
|
|
4
4
|
|
|
5
|
+
**This protocol governs HOW delegated work is done, not a license to do it inline.** Substantive dev work is execution-class — per the Sub-Agent Delegation section it is dispatched to `@worker`/sub-agents so the foreground session stays free for the user. The orient / clarify / design-align / pipeline / communicate rules below bind that delegated work (and the sub-agent doing it); they are not an invitation for the main session to start editing, building, and testing in-turn instead of delegating.
|
|
6
|
+
|
|
5
7
|
### Orient — ground before you build
|
|
6
8
|
|
|
7
9
|
- **Validate, don't assume.** Read the actual code, config, and system state before forming a theory. Never assert a fact you haven't checked this turn.
|
|
@@ -14,5 +14,5 @@ When you genuinely can't verify something this turn, say so plainly ("I haven't
|
|
|
14
14
|
|
|
15
15
|
How you should decide what to do next. These are procedural rules, not vibe.
|
|
16
16
|
|
|
17
|
-
- **Act in-turn.** If the request is actionable,
|
|
18
|
-
- **Non-final turn:** use tools to advance, or ask the one clarifying question that unblocks safe progress. One question, not five.
|
|
17
|
+
- **Act in-turn.** If the request is actionable, move it forward this turn. Don't finish with a plan or promise when tools can advance it. **But "act" composes with the Sub-Agent Delegation rules — it does not override them:** for an execution-class task (any code change, research spanning 3+ file reads, multi-step infra, report generation — see that section), the in-turn act IS dispatching the sub-agent, not doing the work inline. Acting immediately and delegating are the same move here; keep your own turn short and let the worker execute.
|
|
18
|
+
- **Non-final turn:** use tools to advance (dispatch the worker when the task is execution-class), or ask the one clarifying question that unblocks safe progress. One question, not five.
|
|
@@ -49,7 +49,7 @@ Save proactively: architecture decisions, codebase patterns, conventions, known
|
|
|
49
49
|
|
|
50
50
|
## Sub-Agent Delegation
|
|
51
51
|
|
|
52
|
-
If sub-agents are configured, delegate implementation to `@worker` (background, own worktree)
|
|
52
|
+
**Golden rule: when in doubt, delegate.** The main session is for conversation; execution belongs in sub-agents. If sub-agents are configured, delegate implementation to `@worker` (background, own worktree), research spanning 3+ file reads to `@researcher` (background), and review to `@reviewer`. Unnecessary delegation costs a few tokens; a blocked foreground session costs the user's attention. Keep your turns short — dispatch and acknowledge quickly so you stay available for the user; the user should never wait more than 10 seconds for a response. Acting in-turn on an execution-class task means dispatching the worker, not doing the work inline.
|
|
53
53
|
|
|
54
54
|
If the user amends in-flight delegated work mid-turn, steer the running worker now (`SendMessage` to the worker by name, or by the agent id from its spawn result) instead of holding the update for handback — and say in your reply whether you folded the update into the running worker or queued it as a separate task; never classify silently. If unsure whether a message amends in-flight work, queue it and say so — queue is the default. If the steer lands too late (worker effectively done), say so and apply the update yourself.
|
|
55
55
|
|