feat(core): release @passiveintent/core v1.2.0 with IntentManager API#92
feat(core): release @passiveintent/core v1.2.0 with IntentManager API#92purushpsm147 merged 2 commits intomainfrom
Conversation
- `createBrowserIntent()` now returns `IntentManager`, exposing the full public API. - Removed `MouseKinematicsAdapter`; URL tracking is now explicit via `engine.track(pathname)`. - Changed `BigramPolicy` separator to NUL (`\x00`) for collision safety. - Unified guard in `incrementCounter()` to prevent multiple error calls. feat(react): release @passiveintent/react v1.3.0 with useRouteTracker hook - Added `useRouteTracker(pathname)` hook for syncing route changes in push-state SPAs. - Requires `@passiveintent/core@^1.2.0` for compatibility with the new IntentManager. docs: update CHANGELOG.md for core and react packages - Documented changes and new features in both @passiveintent/core and @passiveintent/react.
📝 WalkthroughWalkthrough
Changes
Sequence Diagram(s)sequenceDiagram
participant Component as React Component
participant Hook as useRouteTracker Hook
participant Provider as PassiveIntentProvider
participant Engine as IntentManager
Component->>Hook: render with currentRoute
Hook->>Hook: store prev route (useRef)
Hook->>Hook: useEffect detects route change
Hook->>Provider: read PassiveIntentContext
Provider-->>Hook: returns ctx (track method)
Hook->>Engine: ctx.track(newRoute)
Engine->>Engine: emit state_change event
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~30 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
packages/react/package.json (1)
68-72:⚠️ Potential issue | 🟠 MajorUpdate peerDependency to require
@passiveintent/core@^1.2.0.The CHANGELOG at
packages/react/CHANGELOG.mdexplicitly states that version 1.3.0 "Requires@passiveintent/core@^1.2.0", but thepeerDependenciesstill declares^1.1.0. This mismatch could cause consumers usingcore@1.1.xto encounter unexpected behavior or type errors, since the newuseRouteTrackerhook and updated API surface depend on theIntentManagerchanges introduced in core 1.2.0.🔧 Proposed fix
"peerDependencies": { - "@passiveintent/core": "^1.1.0", + "@passiveintent/core": "^1.2.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" },🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/react/package.json` around lines 68 - 72, Update the peerDependency for `@passiveintent/core` in packages/react's package.json from ^1.1.0 to ^1.2.0 to match the CHANGELOG and ensure compatibility with the new useRouteTracker hook and IntentManager API changes; locate the peerDependencies block in package.json and change the `@passiveintent/core` version string to "^1.2.0".packages/core/docs/architecture.md (1)
2758-2758:⚠️ Potential issue | 🟠 MajorBigram encoding separator docs are stale (
→vs\x00).This section still documents Unicode arrow encoding, but the PR changes the separator to NUL. Keeping this stale will mislead users implementing interop/migrations.
✏️ Suggested doc correction
-**Encoding:** Bigram states are encoded as `"prev→current"` strings (using the Unicode arrow `\u2192`). They share the same `MarkovGraph` with unigram states, inheriting LFU pruning under `maxStates`. +**Encoding:** Bigram states are encoded using a NUL separator (`"prev\x00current"`). This avoids delimiter collisions in user-provided state labels. They share the same `MarkovGraph` with unigram states, inheriting LFU pruning under `maxStates`.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/core/docs/architecture.md` at line 2758, The docs still state bigram states are encoded as "prev→current" (Unicode arrow) but the implementation now uses a NUL separator ("\x00"); update the Architecture docs text that describes Bigram encoding to reflect the NUL separator (e.g., replace the quoted example "prev→current" with "prev\x00current" and mention that MarkovGraph bigram/unigram states share LFU pruning under maxStates), ensuring any references to the Unicode arrow are removed so interop/migration guidance matches the actual implementation.
🧹 Nitpick comments (2)
packages/react/src/hooks.ts (1)
1000-1001: Consider updating JSDoc reference to removed adapter.The comment references
MouseKinematicsAdapterwhich is being removed in this release. While the explanation is technically accurate (explaining why the hook exists), it may confuse readers who won't find this adapter in the codebase. Consider rephrasing to focus on the behavior rather than the removed component.📝 Suggested documentation update
/** * `useRouteTracker` — manually syncs route changes into the engine for * push-state SPAs (Next.js App Router, React Router v6, Vue Router, etc.) - * where `history.pushState` is not intercepted by `MouseKinematicsAdapter`. + * where `history.pushState` navigation does not automatically trigger tracking.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/react/src/hooks.ts` around lines 1000 - 1001, The JSDoc mentions the now-removed symbol MouseKinematicsAdapter which will confuse readers; update the comment to remove that adapter name and instead describe the behavior (e.g., single-page app navigation via history.pushState not being intercepted by mouse/kinematics listeners) and why the hook exists, keeping examples like Next.js App Router / React Router v6 for context; locate the JSDoc that references MouseKinematicsAdapter in packages/react/src/hooks.ts and replace the adapter name with a short description of the behavior that triggers the hook fallback.packages/core/cypress/e2e/browser-intent.cy.ts (1)
96-101: Optionally harden telemetry assertions for stronger signal.You already check shape/type; consider also asserting non-empty
sessionIdand finite, non-negativetransitionsEvaluatedto catch subtle regressions.✅ Suggested test hardening
it('getTelemetry() returns a valid telemetry snapshot', () => { cy.window().then((win) => { const telemetry = win.__engine.getTelemetry(); - expect(telemetry).to.have.property('sessionId').that.is.a('string'); - expect(telemetry).to.have.property('transitionsEvaluated').that.is.a('number'); + expect(telemetry).to.have.property('sessionId').that.is.a('string').and.not.be.empty; + expect(telemetry).to.have.property('transitionsEvaluated').that.is.a('number'); + expect(Number.isFinite(telemetry.transitionsEvaluated)).to.equal(true); + expect(telemetry.transitionsEvaluated).to.be.at.least(0); }); });🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/core/cypress/e2e/browser-intent.cy.ts` around lines 96 - 101, The test for getTelemetry() currently only checks types; improve assertions in the it('getTelemetry() returns a valid telemetry snapshot') block by asserting that telemetry.sessionId (from win.__engine.getTelemetry()) is a non-empty string and that telemetry.transitionsEvaluated is a finite integer >= 0 (e.g., Number.isFinite and >= 0 or other appropriate checks) to ensure stronger, non-empty/valid values are returned; update the expect assertions accordingly inside the cy.window().then callback.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/core/CHANGELOG.md`:
- Around line 19-23: Update the changelog entry to explicitly mention that
removing MouseKinematicsAdapter also removed the old deferred initial pathname
auto-track: callers upgrading from createBrowserIntent() (which now returns
IntentManager) must explicitly call engine.track(window.location.pathname) (or
equivalent) on startup to reproduce the previous initial-path emit; reference
createBrowserIntent(), MouseKinematicsAdapter, and engine.track() in the note so
readers know exactly what to add during migration.
In `@packages/core/docs/architecture.md`:
- Around line 1300-1301: Update the Layer 3 description (the sentence about
"Returns a fully configured IntentManager with browser defaults") to explicitly
state that SPA route synchronization is not automatic: add a short note that
applications must call track(pathname) (or use the framework hook equivalent)
whenever the client-side route changes to sync routes with the IntentManager;
mention IntentManager and track(pathname) by name so readers know which function
to invoke.
- Around line 1341-1343: Update the phrasing that suggests web adapters in
src/plugins/web/ are usable for React Native; clarify that the four concrete
implementations for the microkernel IntentEngine are browser-specific and that
platforms like React Native (and other non-browser hosts such as Electron when
using native shells) require custom adapter implementations or platform-specific
wiring rather than the existing web/* adapters.
In `@packages/core/src/factory.ts`:
- Around line 151-159: The factory createBrowserIntent should preserve the
legacy default storage key instead of passing undefined to IntentManager; update
the storageKey assignment in createBrowserIntent to use config.storageKey if
provided, otherwise fall back to the legacy string "passive-intent-engine"
(i.e., use a nullish/coalesce check) so existing browser models continue to be
persisted under the original key.
In `@packages/core/src/index.ts`:
- Around line 124-125: Update the doc comment for the IntentManager export to
explicitly state that route tracking is not automatic and requires explicit
calls to the IntentManager.track(pathname) method; mention that browser adapters
are wired in but route changes must be reported via track(pathname) rather than
being auto-detected so callers know to migrate to explicit tracking.
In `@packages/react/CHANGELOG.md`:
- Line 23: Update the changelog sentence to clearly separate the two behaviors:
state that useRouteTracker throws a descriptive error when invoked outside
PassiveIntentProvider, and that it only skips the initial track() call in SSR or
when the Provider exists but the engine is not yet live (not when the Provider
is missing). Reference useRouteTracker, PassiveIntentProvider, and track() in
the revised wording so the changelog accurately matches the hook contract.
In `@packages/react/README.md`:
- Around line 215-221: The example RootLayout passes storageKey directly to
PassiveIntentProvider but the component expects a config prop; update RootLayout
to pass a config object (e.g., config={{ storageKey: "my-app" }}) to
PassiveIntentProvider so it matches the documented API used by useRouteTracker
and the API table; locate the PassiveIntentProvider usage in the RootLayout
function and replace the storageKey prop with a single config prop containing
storageKey.
---
Outside diff comments:
In `@packages/core/docs/architecture.md`:
- Line 2758: The docs still state bigram states are encoded as "prev→current"
(Unicode arrow) but the implementation now uses a NUL separator ("\x00"); update
the Architecture docs text that describes Bigram encoding to reflect the NUL
separator (e.g., replace the quoted example "prev→current" with
"prev\x00current" and mention that MarkovGraph bigram/unigram states share LFU
pruning under maxStates), ensuring any references to the Unicode arrow are
removed so interop/migration guidance matches the actual implementation.
In `@packages/react/package.json`:
- Around line 68-72: Update the peerDependency for `@passiveintent/core` in
packages/react's package.json from ^1.1.0 to ^1.2.0 to match the CHANGELOG and
ensure compatibility with the new useRouteTracker hook and IntentManager API
changes; locate the peerDependencies block in package.json and change the
`@passiveintent/core` version string to "^1.2.0".
---
Nitpick comments:
In `@packages/core/cypress/e2e/browser-intent.cy.ts`:
- Around line 96-101: The test for getTelemetry() currently only checks types;
improve assertions in the it('getTelemetry() returns a valid telemetry
snapshot') block by asserting that telemetry.sessionId (from
win.__engine.getTelemetry()) is a non-empty string and that
telemetry.transitionsEvaluated is a finite integer >= 0 (e.g., Number.isFinite
and >= 0 or other appropriate checks) to ensure stronger, non-empty/valid values
are returned; update the expect assertions accordingly inside the
cy.window().then callback.
In `@packages/react/src/hooks.ts`:
- Around line 1000-1001: The JSDoc mentions the now-removed symbol
MouseKinematicsAdapter which will confuse readers; update the comment to remove
that adapter name and instead describe the behavior (e.g., single-page app
navigation via history.pushState not being intercepted by mouse/kinematics
listeners) and why the hook exists, keeping examples like Next.js App Router /
React Router v6 for context; locate the JSDoc that references
MouseKinematicsAdapter in packages/react/src/hooks.ts and replace the adapter
name with a short description of the behavior that triggers the hook fallback.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 3cb63362-70a8-4863-ac32-c2625a686cb8
⛔ Files ignored due to path filters (1)
package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (20)
CHANGELOG.mdpackages/core/CHANGELOG.mdpackages/core/README.mdpackages/core/cypress/e2e/browser-intent.cy.tspackages/core/docs/architecture.mdpackages/core/package.jsonpackages/core/sandbox/browser-intent/app.tspackages/core/src/engine/intent-manager.tspackages/core/src/engine/policies/bigram-policy.tspackages/core/src/factory.tspackages/core/src/index.tspackages/core/tests/microkernel.test.mjspackages/core/tests/policies.test.mjspackages/core/tests/unit-fast.test.mjspackages/react/CHANGELOG.mdpackages/react/README.mdpackages/react/package.jsonpackages/react/src/hooks.tspackages/react/src/index.tspackages/react/tests/hooks.test.ts
There was a problem hiding this comment.
🧹 Nitpick comments (1)
packages/core/CHANGELOG.md (1)
23-23: Tighten wording for readability at Line 23.“outside of the initial page-load emit” reads cleaner as “outside the initial page-load emit.”
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/core/CHANGELOG.md` at line 23, Update the phrasing in the CHANGELOG entry referencing MouseKinematicsAdapter: replace “outside of the initial page-load emit” with “outside the initial page-load emit.” inside the paragraph that mentions MouseKinematicsAdapter, IntentManager, IInputAdapter, createBrowserIntent, engine.track, and useRouteTracker so the sentence reads more cleanly while keeping the same meanings and references.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/core/CHANGELOG.md`:
- Line 23: Update the phrasing in the CHANGELOG entry referencing
MouseKinematicsAdapter: replace “outside of the initial page-load emit” with
“outside the initial page-load emit.” inside the paragraph that mentions
MouseKinematicsAdapter, IntentManager, IInputAdapter, createBrowserIntent,
engine.track, and useRouteTracker so the sentence reads more cleanly while
keeping the same meanings and references.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 0a5ca964-223b-4ee7-897e-e1ad0bfa150e
📒 Files selected for processing (6)
packages/core/CHANGELOG.mdpackages/core/docs/architecture.mdpackages/core/src/factory.tspackages/core/src/index.tspackages/react/CHANGELOG.mdpackages/react/README.md
✅ Files skipped from review due to trivial changes (2)
- packages/core/src/index.ts
- packages/react/README.md
🚧 Files skipped from review as they are similar to previous changes (3)
- packages/core/docs/architecture.md
- packages/react/CHANGELOG.md
- packages/core/src/factory.ts
This pull request introduces a new minor version (1.2.0) of
@passiveintent/corewith significant changes to the browser integration API, as well as related documentation, changelog, and test updates. The most important change is thatcreateBrowserIntent()now returns a fullIntentManager(with the complete public API) instead of the limitedIntentEnginemicrokernel, and URL tracking is now always explicit viaengine.track(pathname). Several other improvements and clarifications have been made to the bigram separator, error handling, and documentation.Core API and Behavior Changes:
createBrowserIntent()now returns anIntentManagerwith the full 13-method public API (e.g.,getTelemetry,predictNextStates, counters,exportGraph, etc.), instead of the previous limitedIntentEngine. This is additive and backward-compatible at runtime, but the TypeScript return type widens. ([[1]](https://github.com/passiveintent/core/pull/92/files#diff-7eb5f05e9df8fd39bfe2e12fec9151ad1eac23e9e7a4dd7891f4b2d1d450faf2R15-R33),[[2]](https://github.com/passiveintent/core/pull/92/files#diff-af0c08d6f291aa75c55d4ad3ec19fd4b728edcf43a39c80d566f661b3b311c44L177-R179),[[3]](https://github.com/passiveintent/core/pull/92/files#diff-af0c08d6f291aa75c55d4ad3ec19fd4b728edcf43a39c80d566f661b3b311c44L656-R656),[[4]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L11-R15),[[5]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L26-R34),[[6]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L45-R56),[[7]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L84-L105),[[8]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L135-L146),[[9]](https://github.com/passiveintent/core/pull/92/files#diff-23ae42edc4683bfb6c2b26dea93de94504b8334c1cd7f9ecffbd088fea5c1317L16-R18),[[10]](https://github.com/passiveintent/core/pull/92/files#diff-23ae42edc4683bfb6c2b26dea93de94504b8334c1cd7f9ecffbd088fea5c1317R54-R62),[[11]](https://github.com/passiveintent/core/pull/92/files#diff-3df99b0cbd1ab7c7f98cc7abf556aa248867200f6ae86001ed58fa60f17e1f13L13-R19),[[12]](https://github.com/passiveintent/core/pull/92/files#diff-3df99b0cbd1ab7c7f98cc7abf556aa248867200f6ae86001ed58fa60f17e1f13L29-R28),[[13]](https://github.com/passiveintent/core/pull/92/files#diff-3df99b0cbd1ab7c7f98cc7abf556aa248867200f6ae86001ed58fa60f17e1f13L41-R43),[[14]](https://github.com/passiveintent/core/pull/92/files#diff-0b810c38f3c138a3d5e44854edefd5eb966617ca84e62f06511f60acc40546c7L3-R3))MouseKinematicsAdapteris no longer part of the factory; URL tracking must now always be explicit viaengine.track(pathname), aligning with the React SDK'suseRouteTracker. ([[1]](https://github.com/passiveintent/core/pull/92/files#diff-7eb5f05e9df8fd39bfe2e12fec9151ad1eac23e9e7a4dd7891f4b2d1d450faf2R15-R33),[[2]](https://github.com/passiveintent/core/pull/92/files#diff-af0c08d6f291aa75c55d4ad3ec19fd4b728edcf43a39c80d566f661b3b311c44L177-R179),[[3]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L45-R56),[[4]](https://github.com/passiveintent/core/pull/92/files#diff-23ae42edc4683bfb6c2b26dea93de94504b8334c1cd7f9ecffbd088fea5c1317R54-R62),[[5]](https://github.com/passiveintent/core/pull/92/files#diff-3df99b0cbd1ab7c7f98cc7abf556aa248867200f6ae86001ed58fa60f17e1f13L13-R19),[[6]](https://github.com/passiveintent/core/pull/92/files#diff-3df99b0cbd1ab7c7f98cc7abf556aa248867200f6ae86001ed58fa60f17e1f13L29-R28))Algorithm & Data Handling:
BigramPolicyseparator is changed from the Unicode arrow (→) to the NUL character (\x00), making bigram edge keys collision-resistant even for custom state labels. Existing bigram edges in persisted graphs will be ignored and relearned. ([[1]](https://github.com/passiveintent/core/pull/92/files#diff-7eb5f05e9df8fd39bfe2e12fec9151ad1eac23e9e7a4dd7891f4b2d1d450faf2R15-R33),[[2]](https://github.com/passiveintent/core/pull/92/files#diff-3f606d4257b5416fb9d3fcd223d2b0d9f99beaefeb2b7bc09dc91994d3aad630L19-R21),[[3]](https://github.com/passiveintent/core/pull/92/files#diff-3f606d4257b5416fb9d3fcd223d2b0d9f99beaefeb2b7bc09dc91994d3aad630L41-R42))Bug Fixes & Error Handling:
incrementCounter()is unified to a single check (typeof by !== 'number' || !Number.isFinite(by)) to prevent multiple error emissions for invalid input. ([[1]](https://github.com/passiveintent/core/pull/92/files#diff-7eb5f05e9df8fd39bfe2e12fec9151ad1eac23e9e7a4dd7891f4b2d1d450faf2R15-R33),[[2]](https://github.com/passiveintent/core/pull/92/files#diff-73c296c200d92fe89a1b1cb6fcca77442eb8413c91969db2bd0ba83a48c99588R639),[[3]](https://github.com/passiveintent/core/pull/92/files#diff-73c296c200d92fe89a1b1cb6fcca77442eb8413c91969db2bd0ba83a48c99588L648-L656))Documentation & Testing:
[[1]](https://github.com/passiveintent/core/pull/92/files#diff-06572a96a58dc510037d5efa622f9bec8519bc1beab13c9f251e97e657a9d4edR15-R29),[[2]](https://github.com/passiveintent/core/pull/92/files#diff-7eb5f05e9df8fd39bfe2e12fec9151ad1eac23e9e7a4dd7891f4b2d1d450faf2R15-R33),[[3]](https://github.com/passiveintent/core/pull/92/files#diff-af0c08d6f291aa75c55d4ad3ec19fd4b728edcf43a39c80d566f661b3b311c44L177-R179),[[4]](https://github.com/passiveintent/core/pull/92/files#diff-af0c08d6f291aa75c55d4ad3ec19fd4b728edcf43a39c80d566f661b3b311c44L656-R656),[[5]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L11-R15),[[6]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L26-R34),[[7]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L45-R56),[[8]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L84-L105),[[9]](https://github.com/passiveintent/core/pull/92/files#diff-097350575d712f33b11767cc33913621617a28bf23a16fbf7d59384503128c54L135-L146),[[10]](https://github.com/passiveintent/core/pull/92/files#diff-941203926b9764ef11068cb054376832351e5d9ca0c8d56e9c46272ac8c77b83L1300-R1300),[[11]](https://github.com/passiveintent/core/pull/92/files#diff-941203926b9764ef11068cb054376832351e5d9ca0c8d56e9c46272ac8c77b83L1341-R1343),[[12]](https://github.com/passiveintent/core/pull/92/files#diff-23ae42edc4683bfb6c2b26dea93de94504b8334c1cd7f9ecffbd088fea5c1317L16-R18),[[13]](https://github.com/passiveintent/core/pull/92/files#diff-23ae42edc4683bfb6c2b26dea93de94504b8334c1cd7f9ecffbd088fea5c1317R54-R62),[[14]](https://github.com/passiveintent/core/pull/92/files#diff-3df99b0cbd1ab7c7f98cc7abf556aa248867200f6ae86001ed58fa60f17e1f13L13-R19),[[15]](https://github.com/passiveintent/core/pull/92/files#diff-3df99b0cbd1ab7c7f98cc7abf556aa248867200f6ae86001ed58fa60f17e1f13L29-R28),[[16]](https://github.com/passiveintent/core/pull/92/files#diff-3df99b0cbd1ab7c7f98cc7abf556aa248867200f6ae86001ed58fa60f17e1f13L41-R43))These changes make the browser integration more powerful and explicit, improve collision safety in graph storage, and clarify the API for both vanilla JS and framework users.-
createBrowserIntent()now returnsIntentManager, exposing the full public API.MouseKinematicsAdapter; URL tracking is now explicit viaengine.track(pathname).BigramPolicyseparator to NUL (\x00) for collision safety.incrementCounter()to prevent multiple error calls.feat(react): release @passiveintent/react v1.3.0 with useRouteTracker hook
useRouteTracker(pathname)hook for syncing route changes in push-state SPAs.@passiveintent/core@^1.2.0for compatibility with the new IntentManager.docs: update CHANGELOG.md for core and react packages
Description
Type of change
Checklist
npm run lintandnpm run typechecklocallynpm run test:unit -w @passiveintent/core)Summary by CodeRabbit
New Features
Breaking Changes
Bug Fixes