{"_id":"@carbon-ni/pi-bebop","_rev":"2-873070ffbb2bb36d72d6fb3b7df6b077","name":"@carbon-ni/pi-bebop","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@carbon-ni/pi-bebop","version":"0.1.0","_id":"@carbon-ni/pi-bebop@0.1.0","maintainers":[{"name":"cristianoliveira","email":"contato@cristianoliveira.com.br"}],"homepage":"https://github.com/carbon-ni/pi-bebop#readme","bugs":{"url":"https://github.com/carbon-ni/pi-bebop/issues"},"pi":{"extensions":["./dist/extension.js"]},"bin":{"pi-bebop":"dist/cli/main.js"},"dist":{"shasum":"2003ca8cc0ad3b3799be96460714839ae0ae1c5a","tarball":"https://registry.npmjs.org/@carbon-ni/pi-bebop/-/pi-bebop-0.1.0.tgz","fileCount":90,"integrity":"sha512-Ot06xM9mYWpXOcpk8lNHHuOo9nLotaLiTFVrBmg7REOnjoqQUASMWNjy3mjjhRRBV73BOULcYfxwOuBDtJqFEw==","signatures":[{"sig":"MEQCIDCB90mPZsJ0eDZHKk/uMVZ+cMcbEBhD6XCrwBDROTQvAiBHjDwqMp5jI1UlkFqL/5va5b59JctjSxL7yaThQx7lrw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1449507},"main":"./dist/extension.js","type":"module","_from":"file:.release/carbon-ni-pi-bebop-0.1.0.tgz","scripts":{"lint":"npm run typecheck && npm run typecheck:presence-tests","test":"node scripts/run-tests.mjs","build":"node scripts/build.mjs","prepack":"npm run build","pretest":"npm run build","typecheck":"tsc --noEmit","verify:cli":"npm run test:coverage:cli && npm run verify:cli-complexity && npm run verify:package","format:check":"prettier --check \"src/**/*.ts\" index.ts \"scripts/**/*.mjs\" package.json .watch.yaml .prettierrc.json tsconfig.json","format:write":"prettier --write \"src/**/*.ts\" index.ts \"scripts/**/*.mjs\" package.json .watch.yaml .prettierrc.json tsconfig.json","test:coverage":"node --test --experimental-test-coverage --import tsx src/**/*.test.ts","verify:readme":"node scripts/verify-readme.mjs","verify:package":"node scripts/verify-package.mjs","test:coverage:cli":"node scripts/verify-cli-coverage.mjs","check:package-json":"node scripts/check-package-json.mjs","verify:cli-complexity":"node scripts/verify-cli-complexity.mjs","typecheck:presence-tests":"tsc --noEmit -p tsconfig.tests.json"},"_npmUser":{"name":"cristianoliveira","email":"contato@cristianoliveira.com.br"},"_resolved":"/Users/cristianoliveira/other/ai/pi/agent/extensions/pi-bebop/.release/carbon-ni-pi-bebop-0.1.0.tgz","_integrity":"sha512-Ot06xM9mYWpXOcpk8lNHHuOo9nLotaLiTFVrBmg7REOnjoqQUASMWNjy3mjjhRRBV73BOULcYfxwOuBDtJqFEw==","repository":{"url":"git+https://github.com/carbon-ni/pi-bebop.git","type":"git"},"_npmVersion":"10.9.3","description":"Independent crew management for Pi agents","directories":{},"_nodeVersion":"22.20.0","dependencies":{"commander":"15.0.0","@toon-format/toon":"4.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.5","esbuild":"^0.25.12","typebox":"1.1.38","prettier":"3.6.2","typescript":"^5.8.3","@types/node":"^22.13.0","@sinclair/typebox":"0.34.50","@earendil-works/pi-ai":"0.84.2","@earendil-works/pi-tui":"0.84.2","@earendil-works/pi-coding-agent":"0.84.2"},"peerDependencies":{"typebox":">=1.1.38 <1.2.0","@sinclair/typebox":">=0.34.50 <0.35.0","@earendil-works/pi-ai":">=0.84.2 <0.85.0","@earendil-works/pi-tui":">=0.84.2 <0.85.0","@earendil-works/pi-coding-agent":">=0.84.2 <0.85.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-bebop_0.1.0_1787717964953_0.2072579407778561","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"pi":{"extensions":["./dist/extension.js"]},"_id":"@carbon-ni/pi-bebop@0.2.0","bin":{"pi-bebop":"dist/cli/main.js"},"bugs":{"url":"https://github.com/carbon-ni/pi-bebop/issues"},"dist":{"shasum":"f96cea60359faeecc7300c1a5694df638c12bf1c","tarball":"https://registry.npmjs.org/@carbon-ni/pi-bebop/-/pi-bebop-0.2.0.tgz","fileCount":120,"integrity":"sha512-81Ru7QEsftuEx1wl141MUiIsE4NnxSR8F0thBb+QeQ7FirHlZcfrbziKJJKqP9kkPV1Am3fCW51LK8Ew7U+Trg==","signatures":[{"sig":"MEYCIQDN4Uswsc+fOL6ENXZ1DOj8Xk9zu2BGOG0jINe64mhlFwIhANH2X8Uss4JFrHUSJG9swC+MZefP5G0jXiDOf1PraJnY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIA3wMX8vR4K963iksO0ewf+bmiqByLMf5BNaO4z2Cyb2AiBaBQbwzLif0tF3mXJJW7MBSAKFhXNL4fBN0zlFMZo7Pw=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@carbon-ni%2fpi-bebop@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2033775},"main":"./dist/extension.js","name":"@carbon-ni/pi-bebop","type":"module","_from":"file:.release/carbon-ni-pi-bebop-0.2.0.tgz","scripts":{"lint":"npm run typecheck && npm run typecheck:presence-tests","test":"node scripts/run-tests.mjs","build":"node scripts/build.mjs","prepack":"npm run build","pretest":"npm run build","typecheck":"tsc --noEmit","verify:cli":"npm run test:coverage:cli && npm run verify:cli-complexity && npm run verify:package","format:check":"prettier --check \"src/**/*.ts\" index.ts \"scripts/**/*.mjs\" .watch.yaml .prettierrc.json tsconfig.json","format:write":"prettier --write \"src/**/*.ts\" index.ts \"scripts/**/*.mjs\" .watch.yaml .prettierrc.json tsconfig.json","test:coverage":"node --test --experimental-test-coverage --import tsx src/**/*.test.ts","verify:package":"node scripts/verify-package.mjs","test:coverage:cli":"node scripts/verify-cli-coverage.mjs","verify:cli-complexity":"node scripts/verify-cli-complexity.mjs","typecheck:presence-tests":"tsc --noEmit -p tsconfig.tests.json"},"version":"0.2.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:53695836-b8a2-468b-a3cd-50631f1b320a"}},"homepage":"https://github.com/carbon-ni/pi-bebop#readme","_resolved":"/home/runner/work/pi-bebop/pi-bebop/.release/carbon-ni-pi-bebop-0.2.0.tgz","_integrity":"sha512-81Ru7QEsftuEx1wl141MUiIsE4NnxSR8F0thBb+QeQ7FirHlZcfrbziKJJKqP9kkPV1Am3fCW51LK8Ew7U+Trg==","repository":{"url":"git+https://github.com/carbon-ni/pi-bebop.git","type":"git"},"_npmVersion":"11.5.1","description":"Independent crew management for Pi agents","directories":{},"maintainers":[{"name":"cristianoliveira","email":"contato@cristianoliveira.com.br"}],"_nodeVersion":"22.14.0","dependencies":{"commander":"15.0.0","@toon-format/toon":"4.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.5","esbuild":"^0.25.12","typebox":"1.1.38","prettier":"3.6.2","typescript":"^5.8.3","@types/node":"^22.13.0","@sinclair/typebox":"0.34.50","@earendil-works/pi-ai":"0.84.4","@earendil-works/pi-tui":"0.84.4","@earendil-works/pi-coding-agent":"0.84.4"},"peerDependencies":{"typebox":">=1.1.38 <1.2.0","@sinclair/typebox":">=0.34.50 <0.35.0","@earendil-works/pi-ai":">=0.84.2 <0.85.0","@earendil-works/pi-tui":">=0.84.2 <0.85.0","@earendil-works/pi-coding-agent":">=0.84.2 <0.85.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-bebop_0.2.0_1789302872471_0.3916192640701197"}}},"time":{"created":"2026-08-26T04:19:24.743Z","modified":"2026-09-13T12:34:32.925Z","0.1.0":"2026-08-26T04:19:25.118Z","0.2.0":"2026-09-13T12:34:32.561Z"},"bugs":{"url":"https://github.com/carbon-ni/pi-bebop/issues"},"homepage":"https://github.com/carbon-ni/pi-bebop#readme","repository":{"url":"git+https://github.com/carbon-ni/pi-bebop.git","type":"git"},"description":"Independent crew management for Pi agents","maintainers":[{"name":"cristianoliveira","email":"contato@cristianoliveira.com.br"}],"readme":"# Pi Bebop\n\n<img width=\"250\" alt=\"bebop\" src=\"https://github.com/user-attachments/assets/ff4eccd9-73e7-4e09-a617-ce7b7db7e299\" align=\"right\" />\n\nMake independent PI instances part of a dysfunctional but effective crew.\n\n</br>\n</br>\n</br>\n</br>\n</br>\n\n## What is Pi Bebop\n\nPi Bebop gives your Pi agents a project-local crew: independent members with\nnames and roles, a trusted manifest, and explicit communication and lifecycle\ntools between them. Members join from any worktree or path, and every agent-facing\nsurface is active only while the member is joined.\n\nBebop is transport, not workflow. It moves messages and lifecycle signals between\nmembers; it has no task, Git, review, or CI ownership.\n\n## Why Bebop\n\n- **Independent Pi Members** — each member is its own Pi session with its own\n  context, plans, and tools; nothing is shared implicitly.\n- **Project-local crew identity** — a trusted `.pi/bebop/crew.json` manifest owns\n  names, roles, sockets, and instructions; no global registry.\n- **Explicit communication and lifecycle tools** — every message, request, inbox,\n  interrupt, and wait has a distinct tool with a one-phrase guarantee.\n\n## Install\n\n### Extension\n\n```bash\n## Npm\npi install npm:@carbon-ni/pi-bebop\n\n## GitHub release\npi install git:github.com/carbon-ni/pi-bebop\n```\n\n### CLI\n\n```bash\n## Install\nnpm install -g @carbon-ni/pi-bebop\n\n## Npx\nnpx @carbon-ni/pi-bebop --help\n```\n\nInstall from this checkout so the `pi-bebop` bin is on your PATH:\n\n```bash\nnpm link\npi-bebop --help\n```\n\nOr install the packed tarball into a project:\n\n```bash\nnpm install ./carbon-ni-pi-bebop-0.2.0.tgz\nnpx pi-bebop --help\n```\n\n`pi-bebop --help` prints deterministic root help and exits 0 with no project,\nsession, or filesystem IO. Leaf help is `pi-bebop <command> --help`; leaf `-h`\nis intentionally a structured usage error (exit 2), matching the\ncanonical-long-flags-only contract.\n\n## What's new in 0.2.0\n\n- **Crew Sessions** — capture, list, inspect, resolve, and resume one exact role session.\n- **Session CLI migration** — the `session` command family replaces the former `crew session` naming.\n- **Guest lifecycle and messaging** — trusted admission, revocation, direct messaging, and deterministic broadcast fan-out.\n- **Reliable waits and requests** — correlated outcomes, inbound-message wake-up, bounded deadlines, and explicit failure states.\n\n## Start a Crew\n\n```bash\npi-bebop crew init\n# discover the configured roles before choosing identity (read-only):\npi-bebop crew roles\npi --crew-role lead\npi --crew-role developer\n# in each member session, inspect the authoritative roster:\n/crew members\n```\n\n`crew init` creates a version 2 `.pi/bebop/crew.json`, shared and role\ninstruction templates, and a `sockets/` directory — deterministic,\nnon-interactive, and a safe no-op on rerun. Its default is concise human-readable\ntext showing the created/verified state, target project, relevant paths, and next\ncommand; use `--format toon` or `--format json` for structured output. Review\nnames, Intake contact, common guidance, and role instructions before joining.\n`pi-bebop crew roles` prints the exact configured role values (TOON by default,\n`--format json|text`) rooted at the current working directory, so startup role\nselection never depends on opening `crew.json` manually; it never starts a\nserver, joins, or mutates files. Start each member by its manifest role;\n`/crew members` shows exactly `current`, `online`, or `offline` with configured\nproject socket paths.\n\n## Resume one exact role session\n\nUse the separate role-scoped picker when you need one prior Pi Session for the\ncurrent trusted Crew role:\n\n```bash\npi-bebop session resume --role developer\n```\n\nIt lists only sessions Bebop attributed on their active branch to that exact\nrole and current manifest fingerprint. Cancel or empty discovery launches\nnothing; selecting a session revalidates it, then launches only that exact\nsession with its stored working directory. It never invokes Pi's native picker\nor resumes a whole Crew. See [the role-session contract](docs/ROLE-SESSION-RESUME.md).\n\n## Preserve exact Member sessions\n\nA **Crew Session** is a named, machine-local bookmark linking one trusted Crew\nto the exact persisted Pi Session of each Member captured while online. It is\nnot a shared conversation, process group, task, lock, or whole-Crew launcher.\nCapture before closing the intended Member sessions, then inspect and resolve\none Member at a time later:\n\n```bash\npi-bebop session capture \"auth regression\"\npi-bebop session list\npi-bebop session show <crew-session-id>\npi-bebop session resolve <crew-session-id> <member>\n# review the returned argv/cwd, then run the shell-escaped command manually\n```\n\nCapture never guesses a latest session and keeps explicit missing reasons for\nMembers it cannot validate. `session add <id> <member>` fills one missing\nlink without replacing existing bindings. Resolution validates the exact case-sensitive Member, trusted manifest, supported\nPi Session header, branch-aware active Membership, cwd, endpoint, and current\nprocess observation. A live endpoint returns `already-open`; an unreachable\nendpoint is qualified and is not a lock or race-free guarantee. The result keeps\n`argv` and `cwd` separate and never adds role/socket flags, model settings,\nprompts, or repair instructions. Review the returned fields before running the\nshell-escaped `pi --session <absolute-file>` command manually. Full Pi Session\nreferences appear only on these explicit commands. See the [normative Crew\nSession contract](docs/CREW-SESSION.md) for identity, storage, trust, privacy,\nand stale-session rules.\n\n## Choose communication\n\n| Tool                  | Use when                                                | Guarantee                                                                              |\n| --------------------- | ------------------------------------------------------- | -------------------------------------------------------------------------------------- |\n| `send_member_request` | you need one correlated answer, report, or verdict      | accepted delivery; call `wait_for_request_outcome` to block until the terminal outcome |\n| `send_follow_up`      | ordinary information                                    | accepted delivery only; no correlated Response expected                                |\n| `redirect_member`     | change what a member is doing next                      | steered before the target's next model step; never aborts                              |\n| `send_to_inbox`       | the peer may be offline                                 | persisted durably; read later as a normal follow-up                                    |\n| `interrupt_member`    | work is stuck, harmful, or based on invalid assumptions | best-effort abort plus recovery guidance; never rolls back side effects                |\n| `broadcast_to_crew`   | a shared team-wide constraint                           | transient Broadcast Follow-up to every other member; per-recipient delivery outcomes   |\n\nThe standalone `pi-bebop send --socket` command is accepted-delivery only by\ndefault. Its legacy `--wait turn_end` mode is rejected because Pi exposes only\na global completion event, which cannot be causally tied to this delivery. Use `pi-bebop member request send` followed by `pi-bebop member request wait`,\nor `pi-bebop ask <crew[/member]>`, when one correlated response is required.\n\n`wait_for_member_idle` blocks the current run until the target settles to mechanical idle, goes offline, the bounded timeout expires, or an accepted\nBebop message releases the wait under its original delivery mode. When this is the only call in the tool batch, the waking message is consumed\nimmediately in the next model continuation; message-received never implies idle or completion. Call this coordination wait alone, not in a\nparallel tool batch: Pi only skips the content-free continuation when every result terminates, so a mixed batch may consume the waking message\none continuation later. The bounded timeout is always the fallback.\n`wait_for_request_outcome` blocks the current tool call until a terminal\noutcome or bounded safeguard releases it. An accepted inbound Bebop message\nalso releases the wait so the message can be consumed before waiting again;\nthis does not settle the outbound request or guarantee another Member will\nrespond.\n\n## Boundaries\n\n- Roles are responsibility, not permissions; repeated roles route by exact name.\n- Online or idle is reachability at last observation — never availability or\n  progress.\n- Accepted, Persisted, or Response is never completion; Bebop has no task, Git,\n  review, or CI ownership.\n- Bebop is transport, not workflow: it never claims exactly-once execution and\n  never picks workers or classifies content.\n\n## Development\n\n```bash\nnpm install\nnpm run build\nnpm test\n```\n\n`make all` runs the pre-push gate (format, package, lint, build, test, security).\nRelease verification is separate because it installs a pinned consumer dependency\nset and may need network:\n\n```bash\nmake package-verify\n```\n","readmeFilename":"README.md"}