@agfpd/iapeer 0.4.4 → 0.4.5

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
@@ -21,6 +21,13 @@ router daemon — always on; finds the recipient, checks liveness, delivers
21
21
  recipient peer — asleep? the daemon wakes it and delivers on wake
22
22
  ```
23
23
 
24
+ ## What makes it different
25
+
26
+ - **Real interactive CLI sessions, not headless one-shots.** Each AI peer is a full Claude Code or Codex CLI session, not a disposable `claude -p` / `codex exec` call (as of 2026-06-15, `claude -p` no longer counts against the subscription's main usage limits).
27
+ - **Warm-on-demand lifecycle.** A live session answers fast; after about an hour idle the daemon closes it; the next message brings it back with its context resumed. The message flow drives the lifecycle — not a human's presence.
28
+ - **One identity across runtimes, with one memory.** A peer's `personality` is decoupled from its runtime — the same peer runs on Claude or Codex, switched with a command. By default (set up by `iapeer onboard`) it carries one shared memory (iapeer-memory) keyed to the personality, not the runtime: one personality, one memory, whatever runtime it runs on.
29
+ - **Heterogeneous peers, one protocol.** AI agents, humans (Telegram), and services (timer = cron, watcher = event) are all first-class, addressed the same way over an always-on MCP daemon that exposes exactly one tool, `send_to_peer`.
30
+
24
31
  ## Quick start
25
32
 
26
33
  Requirements: **macOS** (Linux is on the [Roadmap](#roadmap)) and at least one agent runtime — Claude Code or Codex CLI (each AI peer is a live session of one). The installer handles the rest ([bun](https://bun.sh) and `~/.local/bin` on `PATH`).
@@ -78,22 +85,15 @@ Agents reach each other with `send_to_peer`; you can also message any peer over
78
85
 
79
86
  ## Bypass Permissions mode
80
87
 
81
- ⚠️ **iapeer runs your Claude and Codex peers in bypass-permissions / no-sandbox mode — they execute tools (shell, file edits, network) without asking you to approve each action.** This is by design: a peer is a background, headless session with no human watching its terminal, so there is no one to answer a per-tool permission prompt. The launcher therefore starts Claude with `--dangerously-skip-permissions` and Codex with `--dangerously-bypass-approvals-and-sandbox`, and **auto-accepts the one-time "accept bypass mode" screen on your behalf** the first time a peer boots on a fresh machine.
88
+ ⚠️ **iapeer runs your Claude and Codex peers in bypass-permissions / no-sandbox mode — they execute tools (shell commands, file edits, network calls) without asking you to approve each action.** This is by design: a peer is a background, headless session with no human watching its terminal, so there is no one to answer a per-tool permission prompt. The launcher starts Claude with `--dangerously-skip-permissions` and Codex with `--dangerously-bypass-approvals-and-sandbox`, and **auto-accepts the one-time "accept bypass mode" screen on your behalf** the first time a peer boots on a fresh machine.
82
89
 
83
90
  What this means for you, stated plainly:
84
91
 
85
- - A peer can run any command its runtime can run — read and write files across your home dir, install software, make network calls — with **no confirmation step**. There is no sandbox between an agent and your machine.
86
- - You are trusting the model's judgement (and the doctrine/instructions you give each peer) the same way you would trust a developer with a shell on your account.
87
- - iapeer does **not** silently weaken your own interactive `claude`/`codex` setup: the bypass acceptance is recorded per peer in the agent's own config, and the project-MCP pre-approval is written **project-locally** (under the peer's folder), never to your global user settings.
92
+ - A peer can run any command its runtime can run — read and write files anywhere in your home directory, install software, make network calls — with **no confirmation step**. There is no sandbox between an agent and your machine.
93
+ - You are trusting the model's judgment, and the doctrine you give each peer, the same way you would trust a developer with a shell on your account.
94
+ - iapeer does **not** silently weaken your own interactive `claude` / `codex` setup. The bypass acceptance is recorded per peer, in that agent's own config; the project-MCP pre-approval is written **project-locally**, under the peer's folder — never to your global user settings.
88
95
 
89
- Run iapeer on a host you control, give peers only the access they need, and treat a peer's instructions as security-relevant. `iapeer onboard` states this at setup; it is repeated here so the trade-off is explicit before you create your first agent. Details on every first-run dialog: [docs/07 — Install & update](docs/07-install-and-update.md#first-run-dialogs-on-a-clean-machine).
90
-
91
- ## What makes it different
92
-
93
- - **Real interactive CLI sessions, not headless one-shots.** Each AI peer is a full Claude Code or Codex CLI session, not a disposable `claude -p` / `codex exec` call (as of 2026-06-15, `claude -p` no longer counts against the subscription's main usage limits).
94
- - **Warm-on-demand lifecycle.** A live session answers fast; after about an hour idle the daemon closes it; the next message brings it back with its context resumed. The message flow drives the lifecycle — not a human's presence.
95
- - **One identity across runtimes, with one memory.** A peer's `personality` is decoupled from its runtime — the same peer runs on Claude or Codex, switched with a command. By default (set up by `iapeer onboard`) it carries one shared memory (iapeer-memory) keyed to the personality, not the runtime: one personality, one memory, whatever runtime it runs on.
96
- - **Heterogeneous peers, one protocol.** AI agents, humans (Telegram), and services (timer = cron, watcher = event) are all first-class, addressed the same way over an always-on MCP daemon that exposes exactly one tool, `send_to_peer`.
96
+ Run iapeer on a host you control, give each peer only the access it needs, and treat a peer's instructions as security-relevant. `iapeer onboard` states this at setup; it's repeated here so the trade-off is explicit before you create your first agent. Details on every first-run dialog: [docs/07 — Install & update](docs/07-install-and-update.md#first-run-dialogs-on-a-clean-machine).
97
97
 
98
98
  ## Documentation
99
99
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agfpd/iapeer",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Foundation core for the iapeer multi-agent ecosystem: identity, registry, storage, codec.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "agfpd",
package/src/cli/index.ts CHANGED
@@ -1396,8 +1396,34 @@ export async function runCli(argv: string[], env: NodeJS.ProcessEnv = process.en
1396
1396
  env,
1397
1397
  warn: m => errOut(`warn: ${m}\n`),
1398
1398
  })
1399
+ // FU5 parity with `create`: a peer's `runtimes` must list EVERY installed agentic
1400
+ // runtime (the default is just one of them), so `iapeer <other-runtime>` works
1401
+ // without a manual add-runtime. initPeer resolves only the PRIMARY (cwd markers /
1402
+ // --runtime); declare the OTHER installed agentic runtime(s) too — otherwise the
1403
+ // registry the launch dispatch reads (folderLaunch → resolveWakeRuntime) lists the
1404
+ // primary only and `iapeer codex` fails "not declared" on a both-installed host.
1405
+ // addRuntime is capability-only (runs the runtime birth chain, reindexes the
1406
+ // registry from locals, NEVER flips the default); skip for an infra primary.
1407
+ const addedRuntimes: Runtime[] = []
1408
+ if (!isInfraRuntime(r.runtime)) {
1409
+ const { isRuntimeInstalled } = await import('../init/index.ts')
1410
+ const { secondaryRuntimes } = await import('../create/index.ts')
1411
+ const installed = (['claude', 'codex'] as Runtime[]).filter(rt => isRuntimeInstalled(rt, env))
1412
+ for (const rt of secondaryRuntimes(r.runtime, installed)) {
1413
+ try {
1414
+ const outcomes = await addRuntime(rt, { peer: r.personality, env })
1415
+ const o = outcomes.find(x => x.personality === r.personality)
1416
+ if (o && (o.action === 'added' || o.action === 'already')) addedRuntimes.push(rt)
1417
+ else errOut(`warn: could not add runtime "${rt}": ${o?.detail ?? o?.action ?? 'failed'}\n`)
1418
+ } catch (e) {
1419
+ errOut(`warn: could not add runtime "${rt}": ${e instanceof Error ? e.message : String(e)}\n`)
1420
+ }
1421
+ }
1422
+ }
1423
+ const allRuntimes = [r.runtime, ...addedRuntimes]
1399
1424
  out(
1400
- `initialized "${r.personality}" (${r.runtime}); mcp: ${r.mcpConfigPaths.join(', ') || r.codexMcpConfigPath || 'none'}` +
1425
+ `initialized "${r.personality}" (default: ${r.runtime}; runtimes: ${allRuntimes.join(', ')}); ` +
1426
+ `mcp: ${r.mcpConfigPaths.join(', ') || r.codexMcpConfigPath || 'none'}` +
1401
1427
  `${r.bootstrapped ? `; bootstrap: ${r.bootstrapped.state}` : ''}\n`,
1402
1428
  )
1403
1429
  return 0