peertable 0.8.53 → 0.8.55
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
CHANGED
|
@@ -149,7 +149,7 @@ It interviews you, names the members, scaffolds `.team/` (charter + roles, isola
|
|
|
149
149
|
|
|
150
150
|
Working, and used to build itself. First verified end-to-end on 2026-08-08 with a full no-orchestrator loop: two members consulted, claimed, negotiated an interface, shared a discovered pitfall, and shipped a small project with **zero external intervention**. A 2026-08-13 real-seat lifecycle verified in-place model/effort changes and restart recovery. On 2026-08-14, a Grok 4.6 seat joined the room, changed 4.6↔4.5 in the same session, and woke on a direct message in a live acceptance run. On 2026-08-17 the wake-up path was corrected so Grok seats wait for idle, broadcasts keep their body, and a parent without a tmux seat cannot stall the bridge cursor.
|
|
151
151
|
|
|
152
|
-
The current npm release is **peertable 0.8.
|
|
152
|
+
The current npm release is **peertable 0.8.55**.
|
|
153
153
|
|
|
154
154
|
The current product contract is [docs/current-design.md](https://github.com/kitepon/peertable/blob/main/docs/current-design.md). Completed plans and the cumulative decision log are kept under `docs/archive/`; the current document map is [docs/00_overview.md](https://github.com/kitepon/peertable/blob/main/docs/00_overview.md).
|
|
155
155
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "peertable",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.55",
|
|
4
4
|
"description": "A round table of peer agents. No orchestrator at the head. Turn Claude Code, Codex, and Grok sessions into a team of equal, long-lived peers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
package/room/client.mjs
CHANGED
|
@@ -14,7 +14,7 @@ import { boundedRecent, boundedUnread } from './message-bounds.mjs'
|
|
|
14
14
|
|
|
15
15
|
// client.mjs 側のハードコード版数。package.json の version と一致していることを
|
|
16
16
|
// diagnostics の version_consistency が見る(2 つの版数源の drift 検出。決定45)
|
|
17
|
-
const MCP_VERSION = '0.8.
|
|
17
|
+
const MCP_VERSION = '0.8.55'
|
|
18
18
|
const PKG_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
19
19
|
|
|
20
20
|
const USAGE = `usage:
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// steer: 実行中ターンへ agent_steer(Codex 0.153 はキューへ積む)。idle なら delivery=idle が返る。
|
|
8
8
|
// stdout に receipt JSON を1行。失敗は stderr に aiterm のエラー本文を出して非ゼロ。
|
|
9
9
|
import { readFileSync } from 'node:fs'
|
|
10
|
+
import { spawn } from 'node:child_process'
|
|
10
11
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
|
|
11
12
|
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'
|
|
12
13
|
|
|
@@ -29,6 +30,14 @@ try {
|
|
|
29
30
|
process.exit(1)
|
|
30
31
|
}
|
|
31
32
|
const receipt = result.structuredContent ?? JSON.parse(result.content?.[0]?.text ?? '{}')
|
|
33
|
+
// aiterm の契約: dispatch は投げっぱなしでよいが、完了(Stop)は receipt の wait_process で回収する。
|
|
34
|
+
// Claude 席は前の匿名 turn の Stop を回収しない限り次の dispatch が「Claude turn が未解決」で拒否される
|
|
35
|
+
// (実測 2026-09-04: 監査席への 2 通目以降が全部失敗し、監査提出が 10 分読まれなかった)。
|
|
36
|
+
// ここで wait_process を切り離して起動し、bridge は待たない。
|
|
37
|
+
const wp = receipt?.wait_process
|
|
38
|
+
if (wp && typeof wp.executable === 'string' && Array.isArray(wp.args)) {
|
|
39
|
+
spawn(wp.executable, wp.args, { detached: true, stdio: 'ignore', env: process.env }).unref()
|
|
40
|
+
}
|
|
32
41
|
process.stdout.write(`${JSON.stringify(receipt)}\n`)
|
|
33
42
|
} finally {
|
|
34
43
|
await client.close()
|
|
@@ -20,7 +20,7 @@ export function keysForCodexPane(screen) {
|
|
|
20
20
|
if (busy || idleComposer) return null
|
|
21
21
|
// 長いcommand approvalは質問行が24行より上へ押し出される。現在の選択footerが末尾に
|
|
22
22
|
// 在る時だけ全画面を読み、footerが無い通常画面では古いscrollbackを拾わない。
|
|
23
|
-
const activeDialogFooter = /Press enter to confirm or esc to cancel|enter to submit \| esc to cancel/iu.test(tail)
|
|
23
|
+
const activeDialogFooter = /Press enter to confirm or esc to (?:cancel|go back)|enter to submit \| esc to cancel/iu.test(tail)
|
|
24
24
|
const dialogText = activeDialogFooter ? text : tail
|
|
25
25
|
if (dialogText.includes(MCP_ALLOW_NEEDLE) && dialogText.includes(MCP_ALWAYS_ALLOW)) {
|
|
26
26
|
return { kind: 'mcp-allow', keys: ['Down', 'Down', 'Enter'] }
|
|
@@ -28,6 +28,11 @@ export function keysForCodexPane(screen) {
|
|
|
28
28
|
if (dialogText.includes(COMMAND_APPROVAL_NEEDLE) && dialogText.toLowerCase().includes(COMMAND_APPROVAL_DONT_ASK)) {
|
|
29
29
|
return { kind: 'command-approval', keys: ['Down', 'Enter'] }
|
|
30
30
|
}
|
|
31
|
+
// Codex 0.153: 上限接近時に安いモデルへの切替を勧める modal。モデル配置は 02_models の順位表が決めるので
|
|
32
|
+
// 切り替えず「Keep current model (never show again)」(3 番目)を選ぶ(実測 2026-09-04: mio 席が入力不能に)。
|
|
33
|
+
if (dialogText.includes('Approaching rate limits') && dialogText.includes('Keep current model')) {
|
|
34
|
+
return { kind: 'rate-limit-model-switch', keys: ['Down', 'Down', 'Enter'] }
|
|
35
|
+
}
|
|
31
36
|
if (dialogText.includes('Hooks need review')) {
|
|
32
37
|
return { kind: 'hooks', keys: ['Down', 'Enter'] }
|
|
33
38
|
}
|
|
@@ -441,7 +441,8 @@ async function wake(seat, msgs) {
|
|
|
441
441
|
}
|
|
442
442
|
} catch (e) {
|
|
443
443
|
const detail = String(e?.stderr || e?.message || e).split('\n').filter(Boolean).join(' / ').slice(0, 240)
|
|
444
|
-
|
|
444
|
+
// 起動時 prompt の完了待ち(着席直後の Claude/Codex 席)も「今は受け取れない」であり、次周期に再試行する
|
|
445
|
+
if (/入力受付状態になりません|起動時 prompt の完了待ち|AGENT_TUI_BACKGROUNDED|AGENT_TTY_COOKED/u.test(detail)) {
|
|
445
446
|
// 席は在るが今は受け取れない(実行中・ダイアログ・前面回復不能)。次周期に再試行する
|
|
446
447
|
log(`配達できず次周期に再試行: ${seat} ← ${msgs.length} 件: ${detail}`)
|
|
447
448
|
return 'deferred'
|
|
@@ -31,6 +31,9 @@ export function formatWakeNotice(msg) {
|
|
|
31
31
|
export function isWakeupBridgeTarget(member, options = {}) {
|
|
32
32
|
if (!member || typeof member.name !== 'string' || member.name.length === 0) return false
|
|
33
33
|
if (member.delivery?.kind === 'parent_watch') return false
|
|
34
|
+
// Claude 席も bridge の対象にする。channel 通知だけでは idle の席が起きない実測がある
|
|
35
|
+
// (2026-09-04: 監査席が監査提出 #442 を 10 分読まなかった)。aiterm の dispatch は前の匿名 turn の
|
|
36
|
+
// Stop 回収が要るので、aiterm-deliver.mjs が receipt の wait_process を切り離して起動する。
|
|
34
37
|
const parentName = options.parentName
|
|
35
38
|
if (typeof parentName === 'string' && parentName.length > 0 && member.name === parentName) return false
|
|
36
39
|
const observe = member.observe
|