blun-king-cli 9.1.67 → 9.1.69

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/LIESMICH.txt CHANGED
@@ -9,7 +9,7 @@ Installation
9
9
  ------------
10
10
  Die geprüfte Version exakt global installieren:
11
11
 
12
- npm install -g blun-king-cli@9.1.61
12
+ npm install -g blun-king-cli@9.1.69
13
13
 
14
14
  Start
15
15
  -----
@@ -20,6 +20,26 @@ Start
20
20
  Beide Startbefehle verwenden dieselbe Version, dasselbe Konto, dasselbe Modell
21
21
  und dieselben Befehle.
22
22
 
23
+ Standard-MCPs und Eingabesteuerung in 9.1.69
24
+ --------------------------------------------
25
+ Beim Start richtet BLUN King agent-browser, blun-language-guard, context7 und
26
+ unter Windows windows-mcp automatisch ein. Erkannte Standardkonfigurationen
27
+ werden aktiviert; eigene, abweichende MCP-Befehle bleiben unverändert.
28
+
29
+ /mcp
30
+ blun tools list
31
+ blun tools enable context7
32
+
33
+ /mcp zeigt den Betriebszustand ohne internen Konfigurationspfad. In der
34
+ Detailansicht bleibt der Pfad für die Fehlersuche verfügbar.
35
+
36
+ Telegram-Nachrichten werden in Eingangsreihenfolge verarbeitet. Im Leerlauf
37
+ startet die Warteschlange selbstständig; während eines Werkzeuglaufs erfolgt
38
+ die Zustellung am nächsten geschützten Übergabepunkt. Strg+C und Esc brechen
39
+ einen aktiven Zug ab, ohne den geschriebenen Entwurf zu löschen. Das gilt auch
40
+ bei Autovervollständigung, Geistervorschlägen, Bash-Eingabe und einer offenen
41
+ Mehrzeileneingabe.
42
+
23
43
  Zuverlässiger King-Start
24
44
  -----------------------
25
45
  Der Windows-Hilfsprozess für private Pfade übernimmt TEMP und TMP aus der
@@ -98,6 +118,22 @@ Chancen mit Gegenbeleg, Abbruchkriterium und einem direkt nutzbaren
98
118
  /idea-Auftrag. Ohne Nische fragt er zuerst genau einmal nach. Schwache Belege
99
119
  ergeben weniger Treffer oder no_action, niemals aufgefüllte Vorschläge.
100
120
 
121
+ Venture Flywheel: geprüfte Phase-0-Verträge
122
+ --------------------------------------------
123
+ Der Standardskill venture-flywheel enthält reine Verträge für
124
+ Projektidentität, Repository-Trust, Capability-Entscheidungen, versionierte
125
+ Laufzustände und hash-verkettete Prüfereignisse. Phase 0 führt selbst keine
126
+ Befehle, Netzwerkzugriffe oder Deployments aus.
127
+
128
+ Ein vollständiges CommonJS-Beispiel für alle sieben öffentlichen Funktionen
129
+ liegt hier:
130
+
131
+ standard-skills/venture-flywheel/references/BEISPIELE-phase0.md
132
+
133
+ Es zeigt unter anderem, warum sandbox.execute im Repository abgewiesen, in
134
+ einem isolierten Worktree aber erlaubt wird und wie eine Ereigniskette geprüft
135
+ wird.
136
+
101
137
  Im automatisch angebundenen Telegram-Kanal werden ausschließlich /loop, /goal,
102
138
  /idea, /chancenradar, /curiosity, /scout und /befehle als Befehle ausgeführt. Ist der Agent beschäftigt, bleiben
103
139
  sie in der Warteschlange. Andere Slash-Eingaben werden aus Sicherheitsgründen
package/README.md CHANGED
@@ -9,7 +9,7 @@ Voraussetzung ist Node.js 24.15 oder neuer. Die geprüfte Version wird exakt
9
9
  installiert:
10
10
 
11
11
  ```powershell
12
- npm install -g blun-king-cli@9.1.61
12
+ npm install -g blun-king-cli@9.1.69
13
13
  ```
14
14
 
15
15
  ## Reproduzierbares Staging und Packen
@@ -40,6 +40,29 @@ erzeugt `/telegram:access connect` einen einmaligen Code. `/connect CODE` im
40
40
  gewünschten privaten Chat oder in einer Gruppe speichert Chat und Absender
41
41
  intern; der Code verfällt nach zehn Minuten und ist nur einmal verwendbar.
42
42
 
43
+ ## Standard-MCPs und Eingabesteuerung in 9.1.69
44
+
45
+ Beim Start richtet BLUN King `agent-browser`, `blun-language-guard`, `context7`
46
+ und unter Windows `windows-mcp` automatisch ein und aktiviert erkannte
47
+ Standardkonfigurationen wieder. Eigene, abweichende MCP-Befehle bleiben
48
+ unverändert. `/mcp` zeigt den Betriebszustand ohne internen Konfigurationspfad;
49
+ in der Detailansicht bleibt der Pfad für die Fehlersuche verfügbar.
50
+
51
+ Beispiele:
52
+
53
+ ```text
54
+ /mcp
55
+ blun tools list
56
+ blun tools enable context7
57
+ ```
58
+
59
+ Telegram-Nachrichten werden in Eingangsreihenfolge verarbeitet. Trifft eine
60
+ Nachricht im Leerlauf ein, startet die Warteschlange selbstständig; während
61
+ eines Werkzeuglaufs wird sie am nächsten geschützten Übergabepunkt eingefügt.
62
+ `Strg+C` und `Esc` brechen einen aktiven Zug zuverlässig ab, ohne den bereits
63
+ geschriebenen Entwurf zu löschen. Das gilt auch bei Autovervollständigung,
64
+ Geistervorschlägen, Bash-Eingabe und einer noch offenen Mehrzeileneingabe.
65
+
43
66
  ## Zuverlässiger King-Start
44
67
 
45
68
  Der Windows-Hilfsprozess für private Pfade übernimmt `TEMP` und `TMP` aus der
@@ -122,6 +145,19 @@ Der sichtbare Verlauf behält standardmäßig die vollständige laufende und
122
145
  wiederhergestellte Sitzung. Das Mausrad kann den Verlauf direkt beim ersten Zug
123
146
  öffnen; Editor und Fußzeile bleiben dabei fest sichtbar.
124
147
 
148
+ ## Venture Flywheel: geprüfte Phase-0-Verträge
149
+
150
+ Der mitgelieferte Standardskill `venture-flywheel` stellt reine, deterministische
151
+ Verträge für Projektidentität, Repository-Trust, Capability-Entscheidungen,
152
+ versionierte Laufzustände und hash-verkettete Prüfereignisse bereit. Phase 0
153
+ führt selbst keine Befehle, Netzwerkzugriffe oder Deployments aus.
154
+
155
+ Ein vollständiges CommonJS-Beispiel für alle sieben öffentlichen Funktionen
156
+ liegt unter
157
+ `standard-skills/venture-flywheel/references/BEISPIELE-phase0.md`. Es zeigt
158
+ unter anderem, warum `sandbox.execute` im Repository abgewiesen, in einem
159
+ isolierten Worktree aber erlaubt wird und wie eine Ereigniskette geprüft wird.
160
+
125
161
  Im automatisch angebundenen Telegram-Kanal werden ausschließlich `/loop`,
126
162
  `/goal`, `/idea`, `/chancenradar`, `/curiosity`, `/scout` und `/befehle` als Befehle ausgeführt. Ist der Agent
127
163
  beschäftigt, bleiben sie in der Warteschlange. Andere Slash-Eingaben werden aus
@@ -81,16 +81,27 @@ function sameStringArray(left, right) {
81
81
  && left.every((value, index) => value === right[index]);
82
82
  }
83
83
 
84
- function recognizedBundledServer(current, expected) {
85
- return isObject(current)
86
- && current.transport === expected.transport
84
+ function recognizedBundledServer(name, current, expected) {
85
+ if (!isObject(current)) return false;
86
+ const exact = current.transport === expected.transport
87
87
  && current.command === expected.command
88
88
  && sameStringArray(current.args, expected.args);
89
+ if (exact) return true;
90
+ return name === 'context7'
91
+ && current.transport === 'stdio'
92
+ && current.command === 'npx'
93
+ && Array.isArray(current.args)
94
+ && current.args[0] === '-y'
95
+ && /^@upstash\/context7-mcp(?:@[^\s]+)?$/u.test(current.args[1] ?? '');
89
96
  }
90
97
 
91
98
  function migrateBundledTimeouts(name, current, expected) {
92
- if (!recognizedBundledServer(current, expected)) return false;
99
+ if (!recognizedBundledServer(name, current, expected)) return false;
93
100
  let changed = false;
101
+ if (current.enabled === false) {
102
+ current.enabled = true;
103
+ changed = true;
104
+ }
94
105
  if (name === 'agent-browser') {
95
106
  if (current.startupTimeoutMs === 30_000) {
96
107
  current.startupTimeoutMs = expected.startupTimeoutMs;
package/blun.mjs CHANGED
@@ -417230,7 +417230,6 @@ var TelegramChannelController = class {
417230
417230
  stopped = false;
417231
417231
  activeOwner = false;
417232
417232
  ownershipLost = false;
417233
- handoffWarningShown = false;
417234
417233
  ownershipClaimedAt = 0;
417235
417234
  ownedBridge;
417236
417235
  stopPromise;
@@ -417367,9 +417366,9 @@ var TelegramChannelController = class {
417367
417366
  this.activateOwnedChannel();
417368
417367
  return;
417369
417368
  }
417370
- if (!this.handoffWarningShown && Date.now() - this.ownershipClaimedAt >= this.ownershipHandoffWarningMs) {
417371
- this.handoffWarningShown = true;
417372
- this.host.warn(uiText("telegramChannel.bridgeStartFailed", { error: "telegram ownership handoff is still pending" }));
417369
+ if (Date.now() - this.ownershipClaimedAt >= this.ownershipHandoffWarningMs) {
417370
+ this.activateOwnedChannel();
417371
+ return;
417373
417372
  }
417374
417373
  this.handoffTimer = setTimeout(() => this.tryActivateOwnership(), this.ownershipPollMs);
417375
417374
  this.handoffTimer.unref();
@@ -421938,8 +421937,6 @@ var McpManagerComponent = class extends Container {
421938
421937
  const name = selected ? currentTheme.boldFg("primary", server.name) : currentTheme.fg("text", server.name);
421939
421938
  const status = currentTheme.fg(statusTone(server.status), statusLabel$2(server.status));
421940
421939
  lines.push(` ${pointer} ${name} ${status} ${currentTheme.fg("textMuted", toolCount(server))}`);
421941
- const origin = originDescription(server);
421942
- if (origin !== void 0) lines.push(currentTheme.fg("textMuted", ` ${origin}`));
421943
421940
  }
421944
421941
  if (view.items.length === 0) lines.push(currentTheme.fg("textMuted", ` ${uiText("common.noMatches")}`));
421945
421942
  lines.push("");
@@ -422056,10 +422053,6 @@ function groupLabel(group) {
422056
422053
  function sourceLabel(group) {
422057
422054
  return uiText(`mcp.source.${group}`);
422058
422055
  }
422059
- function originDescription(server) {
422060
- if (server.source === "plugin") return uiText("mcp.origin.plugin", { id: server.pluginId ?? uiText("mcp.unknown") });
422061
- return server.configPath === void 0 ? void 0 : sanitizeMcpDisplayText(server.configPath);
422062
- }
422063
422056
  function detailRows(server) {
422064
422057
  const rows = [
422065
422058
  [uiText("mcp.detail.status"), statusLabel$2(server.status)],
@@ -514663,7 +514656,7 @@ var BlunTUI = class {
514663
514656
  ...envelope.meta["image_path"] !== void 0 ? { channelImagePath: envelope.meta["image_path"] } : {}
514664
514657
  });
514665
514658
  this.syncChannelQueueDeadline();
514666
- this.channelQueueDeadline.requestDeliveryNow();
514659
+ this.scheduleQueueDrain();
514667
514660
  this.track("input_queue");
514668
514661
  this.updateQueueDisplay();
514669
514662
  this.state.ui.requestRender();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.67",
3
+ "version": "9.1.69",
4
4
  "description": "BLUN CLI - your own AI agent with a Telegram channel. Get it done. With BLUN.",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -1,4 +1,4 @@
1
1
  {
2
- "version": "9.1.63",
2
+ "version": "9.1.69",
3
3
  "removals": []
4
4
  }
@@ -26,3 +26,7 @@ Read [references/CAPABILITY-MAP.md](references/CAPABILITY-MAP.md) for the build
26
26
  order and [references/SPEC-phase0-state-events.md](references/SPEC-phase0-state-events.md)
27
27
  plus [references/SPEC-phase0-identity-trust.md](references/SPEC-phase0-identity-trust.md)
28
28
  for the currently implemented contracts.
29
+
30
+ The German usage guide in
31
+ [references/BEISPIELE-phase0.md](references/BEISPIELE-phase0.md) contains one
32
+ complete example covering every public Phase 0 function.
@@ -0,0 +1,146 @@
1
+ # Venture Flywheel: Beispiele für Phase 0
2
+
3
+ Phase 0 stellt ausschließlich reine Verträge bereit. Sie führt keine
4
+ Repository-Befehle aus, verwendet kein Netzwerk und führt weder Deployments
5
+ noch Veröffentlichungen, Käufe oder ausgehende Nachrichten durch.
6
+
7
+ ## Öffentliche Funktionen
8
+
9
+ - `deriveProjectIdentity` leitet aus Repository-Fakten und einem
10
+ authentifizierten Konto eine deterministische Projektidentität ab.
11
+ - `createRepositoryTrust` erzeugt den anfänglichen Datensatz mit `UNTRUSTED`.
12
+ - `transitionRepositoryTrust` wendet einen ausdrücklichen, versionierten
13
+ Trust-Wechsel an.
14
+ - `evaluateCapability` liefert `allow`, `deny` oder `approval_required` und
15
+ entscheidet bei Unklarheit ablehnend.
16
+ - `transitionRun` führt genau einen zulässigen, optimistisch versionierten
17
+ Zustandswechsel aus.
18
+ - `createExecutionEvent` erzeugt ein deterministisches, hash-verkettetes
19
+ Prüfereignis und weist geheimnisverdächtige Felder in Nutzdaten ab.
20
+ - `verifyEventChain` prüft Reihenfolge, Verknüpfungen und Hashes einer
21
+ vollständigen Ereigniskette.
22
+
23
+ ## Vollständiges Beispiel
24
+
25
+ Das folgende CommonJS-Beispiel leitet eine Projektidentität ab, erzeugt lokalen
26
+ Trust, vergleicht die Ausführung im Repository mit der Ausführung in einem
27
+ isolierten Worktree, setzt einen Lauf fort, erzeugt zwei verkettete Ereignisse
28
+ und prüft anschließend die Kette.
29
+
30
+ ```js
31
+ const { deriveProjectIdentity } = require('./identity/project-identity.cjs');
32
+ const {
33
+ CAPABILITIES,
34
+ createRepositoryTrust,
35
+ transitionRepositoryTrust,
36
+ } = require('./policy/repository-trust.cjs');
37
+ const { evaluateCapability } = require('./policy/capability-engine.cjs');
38
+ const { transitionRun } = require('./state/task-state-machine.cjs');
39
+ const {
40
+ createExecutionEvent,
41
+ verifyEventChain,
42
+ } = require('./state/execution-event.cjs');
43
+
44
+ const identity = deriveProjectIdentity({
45
+ repository_host: 'github.com',
46
+ repository_owner: 'example',
47
+ repository_name: 'venture',
48
+ canonical_remote_url: 'git@github.com:example/venture.git',
49
+ local_repository_root: 'C:/Work/venture',
50
+ initial_repository_fingerprint: `sha256:${'a'.repeat(64)}`,
51
+ }, { account_id: 'account-123' });
52
+
53
+ const initialTrust = createRepositoryTrust(identity);
54
+ const localCapabilities = [
55
+ 'network.none',
56
+ 'repo.metadata.read',
57
+ 'repo.read',
58
+ 'sandbox.execute',
59
+ 'workspace.write',
60
+ 'worktree.create',
61
+ ];
62
+ const granted = new Set(localCapabilities);
63
+ const localTrust = transitionRepositoryTrust(initialTrust, {
64
+ event_id: 'evt-trust-local',
65
+ expected_version: initialTrust.version,
66
+ from_trust_level: initialTrust.trust_level,
67
+ to_trust_level: 'TRUSTED_LOCAL',
68
+ granted_capabilities: [...granted].sort(),
69
+ denied_capabilities: CAPABILITIES.filter(
70
+ (capability) => !granted.has(capability),
71
+ ),
72
+ });
73
+
74
+ const deniedInRepository = evaluateCapability({
75
+ project_identity: identity,
76
+ repository_trust: localTrust,
77
+ capability: 'sandbox.execute',
78
+ execution_scope: 'repository',
79
+ });
80
+ const allowedInWorktree = evaluateCapability({
81
+ project_identity: identity,
82
+ repository_trust: localTrust,
83
+ capability: 'sandbox.execute',
84
+ execution_scope: 'isolated_worktree',
85
+ });
86
+
87
+ let run = { run_id: 'run-001', state: 'discovered', version: 0 };
88
+ run = transitionRun(run, {
89
+ event_id: 'evt-profiled',
90
+ expected_version: 0,
91
+ from_state: 'discovered',
92
+ to_state: 'profiled',
93
+ });
94
+
95
+ const firstEvent = createExecutionEvent({
96
+ event_id: 'evt-profiled',
97
+ run_id: run.run_id,
98
+ project_id: identity.project_id,
99
+ actor: { type: 'agent', id: 'agent-1', session_id: 'session-1' },
100
+ event_type: 'run.profiled',
101
+ occurred_at: '2026-08-24T10:00:00.000Z',
102
+ payload: {
103
+ from_state: 'discovered',
104
+ to_state: 'profiled',
105
+ version: run.version,
106
+ },
107
+ });
108
+ const secondEvent = createExecutionEvent({
109
+ event_id: 'evt-policy',
110
+ run_id: run.run_id,
111
+ project_id: identity.project_id,
112
+ actor: { type: 'agent', id: 'agent-1', session_id: 'session-1' },
113
+ event_type: 'policy.checked',
114
+ occurred_at: '2026-08-24T10:01:00.000Z',
115
+ payload: { decision: allowedInWorktree.decision },
116
+ previous_event_hash: firstEvent.event_hash,
117
+ });
118
+
119
+ console.log(deniedInRepository);
120
+ console.log(allowedInWorktree);
121
+ console.log(verifyEventChain([firstEvent, secondEvent]));
122
+ ```
123
+
124
+ Erwartete Entscheidungen: Die Ausführung im Repository wird mit
125
+ `isolated_worktree_required` abgewiesen, die Ausführung im isolierten Worktree
126
+ wird erlaubt und die Kettenprüfung liefert `{ ok: true }`.
127
+
128
+ ## Wichtige Schutzregeln
129
+
130
+ - Ein Repository beginnt mit `UNTRUSTED`; Trust-Hochstufungen müssen
131
+ nacheinander erfolgen.
132
+ - Jeder Trust- und Laufwechsel muss die aktuelle `expected_version` verwenden.
133
+ - `workspace.write` und `sandbox.execute` erfordern
134
+ `execution_scope: 'isolated_worktree'`.
135
+ - Externe oder irreversible Fähigkeiten liefern niemals `allow`, sondern
136
+ höchstens `approval_required`.
137
+ - `completed` erfordert `final_evidence_id`, `rolled_back` erfordert
138
+ `rollback_evidence_id` innerhalb von `evidence`.
139
+ - Ereignisnutzdaten mit Feldern wie `token`, `password`, `secret`, `api_key`
140
+ oder `access_token` werden vor dem Hashen abgewiesen.
141
+ - `no_action` ist ein gültiges Endergebnis.
142
+
143
+ ## Prüfung
144
+
145
+ Führe `node --test test/venture-flywheel-state.test.js`,
146
+ `node --test test/venture-flywheel-trust.test.js` und `npm test` aus.
@@ -31,6 +31,19 @@
31
31
  "toolTimeoutMs": 120000
32
32
  }
33
33
  },
34
+ "context7": {
35
+ "owner": "user-mcp",
36
+ "version": "latest",
37
+ "detectTokens": ["context7", "@upstash/context7-mcp"],
38
+ "config": {
39
+ "transport": "stdio",
40
+ "command": "npx",
41
+ "args": ["-y", "@upstash/context7-mcp@latest"],
42
+ "enabled": false,
43
+ "startupTimeoutMs": 40000,
44
+ "toolTimeoutMs": 120000
45
+ }
46
+ },
34
47
  "telegram": {
35
48
  "owner": "managed-plugin",
36
49
  "version": "bundled",