{"_id":"@99percentpeople/pi-cursor-effect","_rev":"8-4e33130b47604ec8c4915df05de06cce","name":"@99percentpeople/pi-cursor-effect","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.0":{"name":"@99percentpeople/pi-cursor-effect","version":"0.1.0","keywords":["pi-package","pi","coding-agent","cursor","animation","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-cursor-effect@0.1.0","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#cursor-effect","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"f74ad76c8047d4b259cfc7816ad36d55748ef233","tarball":"https://registry.npmjs.org/@99percentpeople/pi-cursor-effect/-/pi-cursor-effect-0.1.0.tgz","fileCount":5,"integrity":"sha512-5rK6VevsvnJULSrpA/Tozkmtt0WB1QBH87hP0qofg7cWIljujBOeoNhLeUWD7Gz4ruvuJF57uPqXQU3sG0Sjmw==","signatures":[{"sig":"MEQCIHYOrZYqRbcKE3XKwZt5Zecs+7Rtc9fZ2+ewWCPgsii1AiAPn7TLAxitOimWORfbgHGJPglaXM9xQncSpE2c0pFa/A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31895},"type":"module","gitHead":"1c4948e35dbdeb274339575f9cbe8416cafbdc94","scripts":{"prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"99percentpeople","email":"myzzzyearz@outlook.com"},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/cursor-effect"},"_npmVersion":"12.0.1","description":"Apply selectable visual effects to Pi's main working cursor status","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@99percentpeople/pi-shared-settings":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-effect_0.1.0_1785294720051_0.8637434314665704","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@99percentpeople/pi-cursor-effect","version":"0.1.1","keywords":["pi-package","pi","coding-agent","cursor","animation","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-cursor-effect@0.1.1","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#cursor-effect","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"94aa2cd87865273a89051a5c054d5bca096d2ffb","tarball":"https://registry.npmjs.org/@99percentpeople/pi-cursor-effect/-/pi-cursor-effect-0.1.1.tgz","fileCount":10,"integrity":"sha512-7ENzhrj+amtTazeiBMwo2br9brMoWMr81Eu9NThxBPtL9+WLDR3ldcBHK8XUK7fZqI6MApApHhutNHge7Y63+Q==","signatures":[{"sig":"MEUCIQDe/OQeN8EMn9oiRYSgWczajs6S8Of8Vw2f6if44dyRFgIgZ1U8Y/ckD+EuVgf8Hs895occ24XDXAJZXIitkplwSQQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-cursor-effect@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":48738},"type":"module","gitHead":"0d3ebc3a00b0941bde89ae213a932070de9ce15f","scripts":{"prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15ac062d-5e25-4c82-af8a-775fef926f1c"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/cursor-effect"},"_npmVersion":"11.16.0","description":"Apply selectable visual effects to Pi's main working cursor status","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@99percentpeople/pi-shared-settings":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-effect_0.1.1_1785314474560_0.9320495267394397","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@99percentpeople/pi-cursor-effect","version":"0.1.2","keywords":["pi-package","pi","coding-agent","cursor","animation","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-cursor-effect@0.1.2","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#cursor-effect","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"abdfdea424ccbc1d839d0d2e245cee275658fdca","tarball":"https://registry.npmjs.org/@99percentpeople/pi-cursor-effect/-/pi-cursor-effect-0.1.2.tgz","fileCount":5,"integrity":"sha512-6EpYzx14HZ92XTfyUWorPWTLunQPJiab6Ne8eBdmH1SEHKwXtet/KyhmwEKPS1MGKSjova7YjXi5ozZPUSwkvw==","signatures":[{"sig":"MEYCIQCu03cpm2kVG+oonUHVuriSe8DFrXLNOwrOW0iHhqibsAIhAMGKVA/P4t0uZsFFT2TzZOWn+PMNsWej1lesMhEcq41d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-cursor-effect@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":103988},"type":"module","gitHead":"b01a46896668a3092656b86841488f17ac886979","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15ac062d-5e25-4c82-af8a-775fef926f1c"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/cursor-effect"},"_npmVersion":"11.16.0","description":"Apply selectable visual effects to Pi's main working cursor status","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@99percentpeople/pi-shared-settings":"0.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-effect_0.1.2_1785395912135_0.4194889418008234","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@99percentpeople/pi-cursor-effect","version":"0.1.3","keywords":["pi-package","pi","coding-agent","cursor","animation","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-cursor-effect@0.1.3","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#cursor-effect","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"394c7f2e6fd64051f3ffaf38d401b5bf203b27b2","tarball":"https://registry.npmjs.org/@99percentpeople/pi-cursor-effect/-/pi-cursor-effect-0.1.3.tgz","fileCount":5,"integrity":"sha512-mYhaL7A3IZBT7hzwhroho8cPSuCEwYX2uv6izVPqwVw9RnPPdzZBdxXZC0enia+q+q19NHDiIn7Q2lZ7bIDeVw==","signatures":[{"sig":"MEYCIQCs3XNI6uDoaXFd7UxpGF+QMOI1XyfUIG5U2u7h/zAbUQIhAPg0n0Z29ViyGMP+G5C+V1Y8uJ1qPWhUwrelOoBxdrJ5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-cursor-effect@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":103988},"type":"module","gitHead":"0d85185fc1af2c66df54fcd9347c6e53d10e83f6","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15ac062d-5e25-4c82-af8a-775fef926f1c"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/cursor-effect"},"_npmVersion":"11.16.0","description":"Apply selectable visual effects to Pi's main working cursor status","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@99percentpeople/pi-shared-settings":"0.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-effect_0.1.3_1785411529483_0.1468568741413856","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@99percentpeople/pi-cursor-effect","version":"0.1.4","keywords":["pi-package","pi","coding-agent","cursor","animation","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-cursor-effect@0.1.4","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#cursor-effect","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"6acc6466eddeadfce28bcf2bc53af415593d191c","tarball":"https://registry.npmjs.org/@99percentpeople/pi-cursor-effect/-/pi-cursor-effect-0.1.4.tgz","fileCount":5,"integrity":"sha512-RHmoK2tGz2zJ2yokPCgwHkW4Zd+p0cQiHY38XrNWg5bcaEAZGFqntmnPg+28YfCPdAvFbg/uwxjQPI8RtkjSlQ==","signatures":[{"sig":"MEYCIQD9vYYfw5lSRAU1nj10HaRfOprCHEHTKS3raqDMpwfuPAIhAL8GU6Oib5gPQLO3IcxmRLMZnk5nfwP+UaPkrGggqk6F","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-cursor-effect@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":104207},"type":"module","gitHead":"ae77925cce3dbe6a0950dbf895bdadc8a0a59b46","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15ac062d-5e25-4c82-af8a-775fef926f1c"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/cursor-effect"},"_npmVersion":"11.16.0","description":"Apply selectable visual effects to Pi's main working cursor status","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@99percentpeople/pi-shared-settings":"0.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-effect_0.1.4_1785501210882_0.15450336416270316","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@99percentpeople/pi-cursor-effect","version":"0.1.5","keywords":["pi-package","pi","coding-agent","cursor","animation","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-cursor-effect@0.1.5","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#cursor-effect","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.min.js"]},"dist":{"shasum":"646e4824be35a50a11c5b4fa8e15917ba80882b7","tarball":"https://registry.npmjs.org/@99percentpeople/pi-cursor-effect/-/pi-cursor-effect-0.1.5.tgz","fileCount":5,"integrity":"sha512-Ca7ADtc527TACQxCwBpJDdeZ2eX8oXBFPfSpvR2dOT2tEbH9URkMN77C+nb/BbkEPYWXoBFX42pRIdpOt2uzqw==","signatures":[{"sig":"MEUCIF41MdEdohrS5oqn66EBWLEiJUuYH+DqHyD+Ox5amRlMAiEApwq+SHQpBXlq0+CmV1I660qW7+y+JQjdJ4vP2DJIqoY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-cursor-effect@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":84358},"type":"module","gitHead":"e9fb82fa5b14fd22f55feb487bbb814e1ab45206","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15ac062d-5e25-4c82-af8a-775fef926f1c"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/cursor-effect"},"_npmVersion":"11.16.0","description":"Apply selectable visual effects to Pi's main working cursor status","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@99percentpeople/pi-shared-settings":"0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-effect_0.1.5_1786199274634_0.8589472103782503","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@99percentpeople/pi-cursor-effect","version":"0.1.6","keywords":["pi-package","pi","coding-agent","cursor","animation","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-cursor-effect@0.1.6","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#cursor-effect","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.min.js"]},"dist":{"shasum":"d67340e022fe360ed17e5fecc851c8b63bc3421e","tarball":"https://registry.npmjs.org/@99percentpeople/pi-cursor-effect/-/pi-cursor-effect-0.1.6.tgz","fileCount":5,"integrity":"sha512-EA1t7IzgmrRhcw0aBtIw4yy97vqmaP5gslFFNUTjQjijgJl7611k9BCfPQVgy6ZOsiQbdASmTNSQjgHV4Ta2Yg==","signatures":[{"sig":"MEYCIQCIvTUXjGmetSb3RqunC2PkInZSltw4I8v/fgHrNPSxMgIhAL7/Yt5BwhhQFh/NHyZXvfcCcLUg+Lk8VHQziplv6BVr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-cursor-effect@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":110625},"type":"module","gitHead":"555160c2730fc23372cd23eaf6f3faaad1d6565f","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15ac062d-5e25-4c82-af8a-775fef926f1c"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/cursor-effect"},"_npmVersion":"11.17.0","description":"Apply selectable visual effects to Pi's main working cursor status","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-effect_0.1.6_1786728456297_0.9602834418242847","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@99percentpeople/pi-cursor-effect","version":"0.1.7","description":"Apply selectable visual effects to Pi's main working cursor status","type":"module","pi":{"extensions":["./index.min.js"]},"keywords":["pi-package","pi","coding-agent","cursor","animation","tui"],"author":{"name":"99percentpeople"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/99percentpeople/pi-extensions.git","directory":"extensions/cursor-effect"},"bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"homepage":"https://github.com/99percentpeople/pi-extensions#cursor-effect","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"peerDependencies":{"@earendil-works/pi-coding-agent":"*","@earendil-works/pi-tui":"*"},"gitHead":"65f2d46d0720cc6c72bc260a43e2574261ef61c5","_id":"@99percentpeople/pi-cursor-effect@0.1.7","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-8ArfkUq1sVtcyEOOG41Q6aXWg0yjnJrVBP8IdWMgjGwlbYbzDu4Nym8x4nWgkJEYkAAr4wagO/eKf/rLNQlJzw==","shasum":"045beed8f2b343076ce30755bd1b7dc5aa0eb93a","tarball":"https://registry.npmjs.org/@99percentpeople/pi-cursor-effect/-/pi-cursor-effect-0.1.7.tgz","fileCount":5,"unpackedSize":133743,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-cursor-effect@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICYL3O6xwA7xr9P9tam0LDVbF+BmGsNkIBT9we53j8OCAiEA8PVrGJ91O5zcWQEu6Aaide1hqbXN+mu8nPVzUy5ISps="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15ac062d-5e25-4c82-af8a-775fef926f1c"}},"directories":{},"maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-cursor-effect_0.1.7_1789027488633_0.871150648768815"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-29T03:11:59.813Z","modified":"2026-09-10T08:04:49.109Z","0.1.0":"2026-07-29T03:12:00.202Z","0.1.1":"2026-07-29T08:41:14.697Z","0.1.2":"2026-07-30T07:18:32.298Z","0.1.3":"2026-07-30T11:38:49.620Z","0.1.4":"2026-07-31T12:33:31.033Z","0.1.5":"2026-08-08T14:27:54.773Z","0.1.6":"2026-08-14T17:27:36.493Z","0.1.7":"2026-09-10T08:04:48.785Z"},"bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"author":{"name":"99percentpeople"},"license":"MIT","homepage":"https://github.com/99percentpeople/pi-extensions#cursor-effect","keywords":["pi-package","pi","coding-agent","cursor","animation","tui"],"repository":{"type":"git","url":"git+https://github.com/99percentpeople/pi-extensions.git","directory":"extensions/cursor-effect"},"description":"Apply selectable visual effects to Pi's main working cursor status","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"readme":"# @99percentpeople/pi-cursor-effect\n\nA focused [Pi](https://github.com/earendil-works/pi) extension for selectable\nvisual effects on Pi's **main session status cursors**.\n\nPick a preset (`Claude Code` or `Codex`) for an authentic busy-row look, or\nbuild your own: spinner glyph, animated label effects (wave, shimmer, scan,\nrainbow), speed, color, and direction — all from `/99settings`. Runtime metrics\nadd task elapsed time, output tokens, estimated live throughput, and a final\nsummary independently of the selected theme.\n\n## Demo\n\nAnimated working cursor while the model is busy (Claude Code preset):\n\n![cursor-effect demo](https://raw.githubusercontent.com/99percentpeople/pi-extensions/master/promo/demo/cursor-effect.gif)\n\n## Scope\n\nThis package changes Pi's main `working`, `retry`, `compaction`, and\n`branchSummary` status indicators, including labels such as:\n\n```text\n⠦ Working...\n⠦ Thinking...\n⠦ Analyzing the request\n⠦ Responding…\n⠦ Compacting context... (escape to cancel)\n⠦ Retrying (1/3) in 2s... (escape to cancel)\n```\n\nIt does **not** change assistant Items, reasoning content, tool/bash loaders,\nwidgets, message bodies, model events, or session data. Metrics observe model\nlifecycle events and optionally send a completion summary via `ctx.ui.notify()`. Other extensions, such\nas `thinking-fold`, provide their status labels as plain text and remain fully\nfunctional without this package.\n\n## Themes\n\n- `default` (default): do not override Pi's native loader or label;\n- `claude-code`: the inspected Claude Code 2.1.x platform-specific mark cycle,\n  120ms glyph timing, ANSI 256 orange, and right-to-left three-character label\n  glimmer;\n- `codex`: the current Codex busy-row bullet and synchronized two-second label\n  shimmer, refreshed every 32ms;\n- `custom`: independently configure Loader and Label effects.\n\nPreset themes intentionally expose no speed or color overrides. `Custom` keeps\nLoader and Label controls independent and retains their values while another\npreset is selected.\n\n### Custom Loader effects\n\n| Effect | Description |\n| --- | --- |\n| Pi default | Pi's ten-frame Braille spinner |\n| None | Hide the leading indicator |\n| Claude Code | The platform-specific Claude mark sequence |\n| Pulse | `· • ● •` pulse |\n| Dots | Fixed-width three-dot fill |\n| Bounce | Rising and falling block |\n| Orbit | `◐ ◓ ◑ ◒` rotation |\n\nEvery visible Custom loader supports Slow/Normal/Fast speed and\nAccent/Text/Muted/Claude color. Frames have a stable display width, so the\nlabel does not jump horizontally.\n\n### Custom Label effects\n\n| Effect | Description |\n| --- | --- |\n| None | Keep the native label styling |\n| Wave | A crest with a softer trailing band |\n| Shimmer | A cosine-smoothed highlight |\n| Scan | A crisp moving highlight band |\n| Pulse | Whole-label brightness breathing |\n| Rainbow | A moving ANSI 256-color spectrum |\n\nAnimated labels support speed and a loop pause. Moving effects also support\nleft-to-right, right-to-left, and ping-pong directions. Wave, Shimmer, and Scan\nprovide crest width controls; all non-Rainbow effects support Accent, Thinking,\nand Monochrome palettes. Loader and Label clocks are independent, and label\nsegmentation preserves emoji and combining-character graphemes.\n\n## Runtime metrics\n\nAll four switches are enabled by default and available under\n`/99settings → Cursor Effect → Runtime metrics` in **every** theme:\n\n| Setting | Display |\n| --- | --- |\n| Elapsed time | Total busy interval, including tools, automatic retries and compaction |\n| Output tokens | Completed provider-reported output plus an estimate for the streaming response |\n| Live speed | `≈48.2 tok/s` while working; `Avg 46.1 tok/s` using provider-reported output in the completion notification |\n| Completion notification | Notify once with enabled metrics when the task settles; no persistent footer status |\n\nCompletion notifications follow the elapsed-time, output-token and live-speed\nswitches. There is no separate average-speed switch; legacy `averageSpeed` values\nare ignored. Disabling all three metrics suppresses the notification.\nThe default working label is displayed as `Working...`; custom labels are unchanged.\n\nIllustrative output:\n\n```text\n⠦ Responding... 18s ≈860 out ≈47.8 tok/s\n⠦ Working... 32s 1,024 out ≈47.8 tok/s\n\nDone 42s 1,280 out Avg 46.1 tok/s\n```\n\n**Timing and accuracy:** elapsed time uses a monotonic local clock and stops at\n`agent_settled`, not the earlier `agent_end`. Speed measures client-observed\nmodel-call throughput from `turn_start` to assistant `message_end`, including\nrequest preparation and first-output waiting, but excluding subsequent tool\nexecution, retry backoff, compaction and user idle time. It is not a server-side\ndecode-speed measurement. Final speed divides summed output by summed measured\nmodel-call durations, rather than averaging individual rates.\n\nDuring tool execution or the next call's first-output wait, live speed retains\nthe last displayed value; it is not a measurement of that waiting interval.\nA new task resets the retained value, and speed stays absent until its first\nvalid sample.\n\nLive estimates count streamed text, visible thinking and tool-call JSON using\napproximately four ASCII characters or one non-ASCII code point per token.\nThey are **not tokenizer-exact** and cannot measure hidden reasoning; every\nestimated count/rate has an `≈` prefix. Final counts use `usage.output`, whose\nreasoning/tool-token coverage depends on the provider, so final and live rates\ncan differ. No model calls or network requests are added for measurement.\nMissing usage for a response with visible output (or an error/abort) produces\n`out —` / `Avg — tok/s` rather than a fabricated total. Rates for spans shorter\nthan 500ms are withheld. Errors and cancellation are labelled in the summary.\n\nRetry, compaction and branch-summary rows show only elapsed task time while a\ntask is active; their internal model usage is not included. Standalone manual\ncompaction/branch summarization is not measured. Background tasks surviving the\nagent's completion are not part of its elapsed time.\n\nMetrics are appended only during rendering: existing labels from `thinking-fold`\nremain untouched, and the suffix uses dim styling rather than the label animation.\nA 250ms refresh keeps metrics moving even with both animations disabled. Timers\nare stopped with their loaders and cleaned up on session shutdown/reload. Pi's\nnative wrapping/clipping also applies to metrics, including editor-border status\nplacement and narrow terminals. Completion summaries use Pi's notification UI,\nindependently of custom footers. The existing `completionSummary` config key is\npreserved for compatibility. There is no history persistence or\nreconstruction of timings after reload.\n\n## Install\n\n```bash\npi install npm:@99percentpeople/pi-cursor-effect\n```\n\nFor local development, build the npm artifact before installing the package\ndirectory:\n\n```bash\nbun run build:packages\nbun run --cwd extensions/cursor-effect build\npi install ./extensions/cursor-effect\n```\n\nRestart Pi or run `/reload` after installation.\n\n## Settings\n\nRun `/99settings`. All themes expose runtime metrics:\n\n```text\nCursor Effect\nTheme            Claude Code\nRuntime metrics  4/4 On\n```\n\nSelecting `Custom` dynamically reveals the two detailed submenus:\n\n```text\nCursor Effect\nTheme          Custom\nRuntime metrics 4/4 On\nLoader effect  Pi default\nLabel effect   Wave\n```\n\nThe shared menu displays only installed `@99percentpeople` plugins that expose\nconfigurable values. Configuration persists in:\n\n```text\n~/.pi/agent/99extensions.json\n```\n\nunder the `cursor-effect` namespace:\n\n```json\n{\n  \"cursor-effect\": {\n    \"theme\": \"default\",\n    \"metrics\": {\n      \"elapsed\": true,\n      \"outputTokens\": true,\n      \"liveSpeed\": true,\n      \"completionSummary\": true\n    },\n    \"custom\": {\n      \"loader\": {\n        \"style\": \"pi-default\",\n        \"speed\": \"normal\",\n        \"color\": \"accent\"\n      },\n      \"label\": {\n        \"style\": \"wave\",\n        \"speed\": \"normal\",\n        \"crestWidth\": \"soft\",\n        \"palette\": \"accent\",\n        \"direction\": \"left-to-right\",\n        \"pause\": \"none\"\n      }\n    }\n  }\n}\n```\n\n## Compatibility\n\nPi does not currently expose a renderer hook for its main status indicators.\nThis package therefore installs a guarded patch on `Loader.updateDisplay()`,\n`Loader.render()`, and `Loader.stop()`, activated only for Pi's four main status\nkinds: `working`, `retry`, `compaction`, and `branchSummary`. The `stop()` wrapper\nowns the independent Label timer and prevents it from outliving a status row.\nTool, bash, and extension loaders do not have those kinds and remain unchanged.\nThe patch checks the expected methods at startup, avoids duplicates, and restores\nthe original prototype during session shutdown. Pre-styled ANSI labels are left\nunchanged; enabled metrics can still be appended after them.\n\nStreaming label changes preserve the current Label effect phase instead of\nrestarting it for every partial summary or status message. Loader animation\nremains driven by Pi's normal interval callbacks. Pi rendering and extension\ncallbacks share Node's main event loop, so terminal animation cannot redraw\nwhile a synchronous callback is blocking that thread.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}