{"_id":"@agibuild/fulora-client","_rev":"6-4c3333f90ad2287db03d06f6f032af1c","name":"@agibuild/fulora-client","dist-tags":{"latest":"1.6.10"},"versions":{"1.6.1":{"name":"@agibuild/fulora-client","version":"1.6.1","keywords":["client","services","fulora","webview","bridge","avalonia","rpc","csharp","interop"],"author":{"name":"AGIBuild"},"license":"MIT","_id":"@agibuild/fulora-client@1.6.1","maintainers":[{"name":"agibuild","email":"xiewuhen@live.com"}],"homepage":"https://github.com/AGIBuild/Fulora#readme","bugs":{"url":"https://github.com/AGIBuild/Fulora/issues"},"dist":{"shasum":"1c889ac670f80930236d4f4d0a6da85d6be40bcb","tarball":"https://registry.npmjs.org/@agibuild/fulora-client/-/fulora-client-1.6.1.tgz","fileCount":12,"integrity":"sha512-CngOSinnXj8Ffi3exy44nlTissi8XKwduYW+fTkg9CtfcQe9oXx6YcolPMsDN9aHQ3av35xivdo9gbUc4dQo5w==","signatures":[{"sig":"MEUCIFU2XnTt8MDnemArY4x4AVJA4lkR3V4UNJt8OJfKYZ7cAiEA8KK9sA8f09Rq251+gerMARiIJJLq+A53548dm9zgDT8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31078},"main":"./dist/index.js","type":"module","_from":"file:artifacts/release-bundle/npm/agibuild-fulora-client-1.6.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./profile":{"types":"./dist/profile.d.ts","import":"./dist/profile.js"}},"scripts":{"test":"node --experimental-strip-types --no-warnings --test src/middleware.test.ts && node --experimental-strip-types --no-warnings --test src/integration.test.ts && node --experimental-strip-types --no-warnings --test src/hmr.test.ts && node --experimental-strip-types --no-warnings --test src/worker.test.ts && npm run build && node --no-warnings --test test/profile.test.mjs && node --no-warnings --test test/ready.test.mjs","build":"tsc -p tsconfig.json","prepare":"npm run build"},"_npmUser":{"name":"agibuild","email":"xiewuhen@live.com"},"_resolved":"/home/runner/work/Fulora/Fulora/artifacts/release-bundle/npm/agibuild-fulora-client-1.6.1.tgz","_integrity":"sha512-CngOSinnXj8Ffi3exy44nlTissi8XKwduYW+fTkg9CtfcQe9oXx6YcolPMsDN9aHQ3av35xivdo9gbUc4dQo5w==","repository":{"url":"git+https://github.com/AGIBuild/Fulora.git","type":"git","directory":"packages/bridge"},"_npmVersion":"10.9.7","description":"Fulora client runtime for typed app-service calls from JavaScript.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/fulora-client_1.6.1_1776849759627_0.6706827325117708","host":"s3://npm-registry-packages-npm-production"}},"1.6.2":{"name":"@agibuild/fulora-client","version":"1.6.2","keywords":["client","services","fulora","webview","bridge","avalonia","rpc","csharp","interop"],"author":{"name":"AGIBuild"},"license":"MIT","_id":"@agibuild/fulora-client@1.6.2","maintainers":[{"name":"agibuild","email":"xiewuhen@live.com"}],"homepage":"https://github.com/AGIBuild/Fulora#readme","bugs":{"url":"https://github.com/AGIBuild/Fulora/issues"},"dist":{"shasum":"c64b5d9d391643bbf21e27b8c05183dc32b19ebc","tarball":"https://registry.npmjs.org/@agibuild/fulora-client/-/fulora-client-1.6.2.tgz","fileCount":12,"integrity":"sha512-ZlBifch6wE59KUhFUDCGZ3mwii88mq0ybYqYC1aitCRjp/crulQ+IXl14Cxd1BHZKHUfKMH/TPsxslLnenHCJw==","signatures":[{"sig":"MEUCIQCEfXCNg0lic+w5jcwEhpqq5B8csZ43aorLWy3HaQf5UwIgMATOyCMdOwkkgG9noIDjjGG4EePylcvFdHjI7WPVC0w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31078},"main":"./dist/index.js","type":"module","_from":"file:artifacts/release-bundle/npm/agibuild-fulora-client-1.6.2.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./profile":{"types":"./dist/profile.d.ts","import":"./dist/profile.js"}},"scripts":{"test":"node --experimental-strip-types --no-warnings --test src/middleware.test.ts && node --experimental-strip-types --no-warnings --test src/integration.test.ts && node --experimental-strip-types --no-warnings --test src/hmr.test.ts && node --experimental-strip-types --no-warnings --test src/worker.test.ts && npm run build && node --no-warnings --test test/profile.test.mjs && node --no-warnings --test test/ready.test.mjs","build":"tsc -p tsconfig.json","prepare":"npm run build"},"_npmUser":{"name":"agibuild","email":"xiewuhen@live.com"},"_resolved":"/home/runner/work/Fulora/Fulora/artifacts/release-bundle/npm/agibuild-fulora-client-1.6.2.tgz","_integrity":"sha512-ZlBifch6wE59KUhFUDCGZ3mwii88mq0ybYqYC1aitCRjp/crulQ+IXl14Cxd1BHZKHUfKMH/TPsxslLnenHCJw==","repository":{"url":"git+https://github.com/AGIBuild/Fulora.git","type":"git","directory":"packages/bridge"},"_npmVersion":"10.9.7","description":"Fulora client runtime for typed app-service calls from JavaScript.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/fulora-client_1.6.2_1776859577464_0.2706654933361785","host":"s3://npm-registry-packages-npm-production"}},"1.6.6":{"name":"@agibuild/fulora-client","version":"1.6.6","keywords":["client","services","fulora","webview","bridge","avalonia","rpc","csharp","interop"],"author":{"name":"AGIBuild"},"license":"MIT","_id":"@agibuild/fulora-client@1.6.6","maintainers":[{"name":"agibuild","email":"xiewuhen@live.com"}],"homepage":"https://github.com/AGIBuild/Fulora#readme","bugs":{"url":"https://github.com/AGIBuild/Fulora/issues"},"dist":{"shasum":"8863078c069cd4d67a9a5374509c1a3d50ebbcef","tarball":"https://registry.npmjs.org/@agibuild/fulora-client/-/fulora-client-1.6.6.tgz","fileCount":12,"integrity":"sha512-ke6a1wzP4nWSQ+/T5Rs1tSocq59N8GAmOBCODlXr+sWMcnZ4uR1viSn2/eT1SMhQIRFsU0YrTMSMcnwEtzS5rw==","signatures":[{"sig":"MEQCIC0kCFwU8eMA7TCddA7g95d4jHFyALC4ItxxrY2W6Nb8AiBoov3yPq+tePixEG18WgFcLCFiOPaeTobJYMH10uBjEQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31078},"main":"./dist/index.js","type":"module","_from":"file:artifacts/release-bundle/npm/agibuild-fulora-client-1.6.6.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./profile":{"types":"./dist/profile.d.ts","import":"./dist/profile.js"}},"scripts":{"test":"node --experimental-strip-types --no-warnings --test src/middleware.test.ts && node --experimental-strip-types --no-warnings --test src/integration.test.ts && node --experimental-strip-types --no-warnings --test src/hmr.test.ts && node --experimental-strip-types --no-warnings --test src/worker.test.ts && npm run build && node --no-warnings --test test/profile.test.mjs && node --no-warnings --test test/ready.test.mjs","build":"tsc -p tsconfig.json","prepare":"npm run build"},"_npmUser":{"name":"agibuild","email":"xiewuhen@live.com"},"_resolved":"/home/runner/work/Fulora/Fulora/artifacts/release-bundle/npm/agibuild-fulora-client-1.6.6.tgz","_integrity":"sha512-ke6a1wzP4nWSQ+/T5Rs1tSocq59N8GAmOBCODlXr+sWMcnZ4uR1viSn2/eT1SMhQIRFsU0YrTMSMcnwEtzS5rw==","repository":{"url":"git+https://github.com/AGIBuild/Fulora.git","type":"git","directory":"packages/bridge"},"_npmVersion":"10.9.7","description":"Fulora client runtime for typed app-service calls from JavaScript.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/fulora-client_1.6.6_1776910362526_0.4802235954015368","host":"s3://npm-registry-packages-npm-production"}},"1.6.7":{"name":"@agibuild/fulora-client","version":"1.6.7","keywords":["client","services","fulora","webview","bridge","avalonia","rpc","csharp","interop"],"author":{"name":"AGIBuild"},"license":"MIT","_id":"@agibuild/fulora-client@1.6.7","maintainers":[{"name":"agibuild","email":"xiewuhen@live.com"}],"homepage":"https://github.com/AGIBuild/Fulora#readme","bugs":{"url":"https://github.com/AGIBuild/Fulora/issues"},"dist":{"shasum":"a3dbab7834c5561020d5f4414456c4fca2aea26e","tarball":"https://registry.npmjs.org/@agibuild/fulora-client/-/fulora-client-1.6.7.tgz","fileCount":12,"integrity":"sha512-hb5nZT2OJILdkctt0/0AV0advjmpfDSYuO1+FOT2btlJHnQluG5R1XGjDo6t7QVzxsPyZ5uQX2UezHLD0QUEHQ==","signatures":[{"sig":"MEYCIQCzvor4enViU4oYtdo0x2qC21nJWx1ZGY1aoEJmi1HJjQIhAPKIHk7cnCA5/CqWXH1YiQ6h9iOhwopIy8Xn04FZDGmP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31078},"main":"./dist/index.js","type":"module","_from":"file:artifacts/release-bundle/npm/agibuild-fulora-client-1.6.7.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./profile":{"types":"./dist/profile.d.ts","import":"./dist/profile.js"}},"scripts":{"test":"node --experimental-strip-types --no-warnings --test src/middleware.test.ts && node --experimental-strip-types --no-warnings --test src/integration.test.ts && node --experimental-strip-types --no-warnings --test src/hmr.test.ts && node --experimental-strip-types --no-warnings --test src/worker.test.ts && npm run build && node --no-warnings --test test/profile.test.mjs && node --no-warnings --test test/ready.test.mjs","build":"tsc -p tsconfig.json","prepare":"npm run build"},"_npmUser":{"name":"agibuild","email":"xiewuhen@live.com"},"_resolved":"/home/runner/work/Fulora/Fulora/artifacts/release-bundle/npm/agibuild-fulora-client-1.6.7.tgz","_integrity":"sha512-hb5nZT2OJILdkctt0/0AV0advjmpfDSYuO1+FOT2btlJHnQluG5R1XGjDo6t7QVzxsPyZ5uQX2UezHLD0QUEHQ==","repository":{"url":"git+https://github.com/AGIBuild/Fulora.git","type":"git","directory":"packages/bridge"},"_npmVersion":"10.9.7","description":"Fulora client runtime for typed app-service calls from JavaScript.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/fulora-client_1.6.7_1776914001822_0.7698315536685965","host":"s3://npm-registry-packages-npm-production"}},"1.6.9":{"name":"@agibuild/fulora-client","version":"1.6.9","keywords":["client","services","fulora","webview","bridge","avalonia","rpc","csharp","interop"],"author":{"name":"AGIBuild"},"license":"MIT","_id":"@agibuild/fulora-client@1.6.9","maintainers":[{"name":"agibuild","email":"xiewuhen@live.com"}],"homepage":"https://github.com/AGIBuild/Fulora#readme","bugs":{"url":"https://github.com/AGIBuild/Fulora/issues"},"dist":{"shasum":"9ee031ad82831907a86febbe4a97222eca2fa8f2","tarball":"https://registry.npmjs.org/@agibuild/fulora-client/-/fulora-client-1.6.9.tgz","fileCount":12,"integrity":"sha512-9g4tIxu1oX5i64x2QSSmW2SB+NIdH25LFF0HspX1kU2MMd0Xdy1yLbS35CYPcxE/HvUujEWjojIGOCP8ONQmIQ==","signatures":[{"sig":"MEQCIDEcpl+tqBr8y6JZZC1ETUuuAO084O1ONczXNJ0N1+2JAiBwIobgjWID9TrYCTSGemwICuIIL9vK9Vszay8nhuur7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCmCvCAAKQunII/NgcRzUYc5Y1E35SG5/fHub0xgnMcZAIhAOFp8U7DaxVEvL8KTlXeGo4bMw9hUqGencmWE79B0I5H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agibuild%2ffulora-client@1.6.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":31078},"main":"./dist/index.js","type":"module","_from":"file:artifacts/release-bundle/npm/agibuild-fulora-client-1.6.9.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./profile":{"types":"./dist/profile.d.ts","import":"./dist/profile.js"}},"scripts":{"test":"node --experimental-strip-types --no-warnings --test src/middleware.test.ts && node --experimental-strip-types --no-warnings --test src/integration.test.ts && node --experimental-strip-types --no-warnings --test src/hmr.test.ts && node --experimental-strip-types --no-warnings --test src/worker.test.ts && npm run build && node --no-warnings --test test/profile.test.mjs && node --no-warnings --test test/ready.test.mjs","build":"tsc -p tsconfig.json","prepare":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:82acd585-d994-43cd-ab29-70b1ae2a0920"}},"_resolved":"/home/runner/work/Fulora/Fulora/artifacts/release-bundle/npm/agibuild-fulora-client-1.6.9.tgz","_integrity":"sha512-9g4tIxu1oX5i64x2QSSmW2SB+NIdH25LFF0HspX1kU2MMd0Xdy1yLbS35CYPcxE/HvUujEWjojIGOCP8ONQmIQ==","repository":{"url":"git+https://github.com/AGIBuild/Fulora.git","type":"git","directory":"packages/bridge"},"_npmVersion":"11.19.0","description":"Fulora client runtime for typed app-service calls from JavaScript.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/fulora-client_1.6.9_1789870127109_0.2524050716077648","host":"s3://npm-registry-packages-npm-production"}},"1.6.10":{"_id":"@agibuild/fulora-client@1.6.10","bugs":{"url":"https://github.com/AGIBuild/Fulora/issues"},"dist":{"shasum":"106638e9b6061a481373ac8531a9692342feb8e4","tarball":"https://registry.npmjs.org/@agibuild/fulora-client/-/fulora-client-1.6.10.tgz","fileCount":12,"integrity":"sha512-paQ07cuSv4sObcQl+0Zy0QNPVZvBlkMTZm/ex5BMktvxIdMRZKXf8VpR+CGehinTwoHUo6fP2K/sxEhJeVOnkQ==","signatures":[{"sig":"MEUCIQDBNgz2V0jIZ9g/Ut9uKq+3X+P9e3P6aDhcVnq+r6YA1AIgFnqjZR9fQVsHemHYdHhoCUqaFZ367QIze9xOkrwNS+Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEdaFlIfRoBEtoPJiitooUXygcKkNbAqr2kYgyL/Eu6AAiBI3OAXFewIX0zoWRlgRLr2KcUjMQ4cUjSJrgyB2pOg2g=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agibuild%2ffulora-client@1.6.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":31079},"main":"./dist/index.js","name":"@agibuild/fulora-client","type":"module","_from":"file:artifacts/release-bundle/npm/agibuild-fulora-client-1.6.10.tgz","types":"./dist/index.d.ts","author":{"name":"AGIBuild"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./profile":{"types":"./dist/profile.d.ts","import":"./dist/profile.js"}},"license":"MIT","scripts":{"test":"node --experimental-strip-types --no-warnings --test src/middleware.test.ts && node --experimental-strip-types --no-warnings --test src/integration.test.ts && node --experimental-strip-types --no-warnings --test src/hmr.test.ts && node --experimental-strip-types --no-warnings --test src/worker.test.ts && npm run build && node --no-warnings --test test/profile.test.mjs && node --no-warnings --test test/ready.test.mjs","build":"tsc -p tsconfig.json","prepare":"npm run build"},"version":"1.6.10","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:82acd585-d994-43cd-ab29-70b1ae2a0920"}},"homepage":"https://github.com/AGIBuild/Fulora#readme","keywords":["client","services","fulora","webview","bridge","avalonia","rpc","csharp","interop"],"_resolved":"/home/runner/work/Fulora/Fulora/artifacts/release-bundle/npm/agibuild-fulora-client-1.6.10.tgz","_integrity":"sha512-paQ07cuSv4sObcQl+0Zy0QNPVZvBlkMTZm/ex5BMktvxIdMRZKXf8VpR+CGehinTwoHUo6fP2K/sxEhJeVOnkQ==","repository":{"url":"git+https://github.com/AGIBuild/Fulora.git","type":"git","directory":"packages/bridge"},"_npmVersion":"11.19.0","description":"Fulora client runtime for typed app-service calls from JavaScript.","directories":{},"maintainers":[{"name":"agibuild","email":"xiewuhen@live.com"}],"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fulora-client_1.6.10_1789916590963_0.29009271825300753"}}},"time":{"created":"2026-04-22T09:22:39.525Z","modified":"2026-09-20T15:03:11.354Z","1.6.1":"2026-04-22T09:22:39.807Z","1.6.2":"2026-04-22T12:06:17.613Z","1.6.6":"2026-04-23T02:12:42.674Z","1.6.7":"2026-04-23T03:13:21.989Z","1.6.9":"2026-09-20T02:08:47.194Z","1.6.10":"2026-09-20T15:03:11.037Z"},"bugs":{"url":"https://github.com/AGIBuild/Fulora/issues"},"author":{"name":"AGIBuild"},"license":"MIT","homepage":"https://github.com/AGIBuild/Fulora#readme","keywords":["client","services","fulora","webview","bridge","avalonia","rpc","csharp","interop"],"repository":{"url":"git+https://github.com/AGIBuild/Fulora.git","type":"git","directory":"packages/bridge"},"description":"Fulora client runtime for typed app-service calls from JavaScript.","maintainers":[{"name":"agibuild","email":"xiewuhen@live.com"}],"readme":"# @agibuild/fulora-client\n\nTyped bridge client runtime for [Agibuild.Fulora](https://github.com/AGIBuild/Fulora) — call C# services from JavaScript with full type safety.\n\n## Install\n\n```bash\nnpm install @agibuild/fulora-client\n```\n\n## Quick Start\n\n```typescript\nimport { createBridgeClient } from '@agibuild/fulora-client';\n\nconst bridge = createBridgeClient();\n\n// Wait for the native bridge to be ready\nawait bridge.ready();\n\n// Call a C# service method directly\nconst result = await bridge.invoke<string>('GreeterService.SayHello', { name: 'World' });\n```\n\n## Typed Service Proxies\n\nDefine TypeScript interfaces that mirror your C# `[JsExport]` services, then use `getService()` for type-safe calls:\n\n```typescript\nimport { createBridgeClient, type BridgeServiceMethod } from '@agibuild/fulora-client';\n\n// Define interface matching your C# service\ninterface ISystemInfoService {\n  getSystemInfo: BridgeServiceMethod<void, SystemInfo>;\n  getRuntimeMetrics: BridgeServiceMethod<void, RuntimeMetrics>;\n}\n\ninterface SystemInfo {\n  osName: string;\n  dotnetVersion: string;\n  machineName: string;\n}\n\ninterface RuntimeMetrics {\n  workingSetMb: number;\n  uptimeSeconds: number;\n}\n\n// Create typed proxy\nconst bridge = createBridgeClient();\nconst systemInfo = bridge.getService<ISystemInfoService>('SystemInfoService');\n\n// Fully typed calls\nconst info = await systemInfo.getSystemInfo();       // → SystemInfo\nconst metrics = await systemInfo.getRuntimeMetrics(); // → RuntimeMetrics\n```\n\n## Middleware\n\nAdd cross-cutting concerns (logging, timeout, retry, error normalization) via the middleware pipeline:\n\n```typescript\nimport {\n  createBridgeClient,\n  withLogging,\n  withTimeout,\n  withRetry,\n  withErrorNormalization,\n} from '@agibuild/fulora-client';\n\nconst bridge = createBridgeClient();\n\n// Log all bridge calls in development\nbridge.use(withLogging({ maxParamLength: 100 }));\n\n// 5-second timeout for all calls\nbridge.use(withTimeout(5000));\n\n// Retry transient failures up to 3 times\nbridge.use(withRetry({ maxRetries: 3, delay: 500 }));\n\n// Convert raw RPC errors to typed BridgeError instances\nbridge.use(withErrorNormalization());\n```\n\n### Custom Middleware\n\n```typescript\nimport type { BridgeMiddleware } from '@agibuild/fulora-client';\n\nconst analytics: BridgeMiddleware = async (context, next) => {\n  const start = Date.now();\n  try {\n    const result = await next();\n    trackCall(context.serviceName, context.methodName, Date.now() - start);\n    return result;\n  } catch (err) {\n    trackError(context.serviceName, context.methodName, err);\n    throw err;\n  }\n};\n\nbridge.use(analytics);\n```\n\n## Error Handling\n\n```typescript\nimport { BridgeError, BridgeTimeoutError } from '@agibuild/fulora-client';\n\ntry {\n  await bridge.invoke('SomeService.DoWork');\n} catch (err) {\n  if (err instanceof BridgeTimeoutError) {\n    console.error(`Timed out after ${err.timeoutMs}ms`);\n  } else if (err instanceof BridgeError) {\n    console.error(`RPC error [${err.code}]: ${err.message}`, err.data);\n  }\n}\n```\n\n## API Reference\n\n### `createBridgeClient(resolveRpc?)`\n\nCreates a new bridge client instance. The optional `resolveRpc` parameter allows custom RPC resolution (defaults to `window.agWebView.rpc`).\n\n### `BridgeClient`\n\n| Method | Description |\n|---|---|\n| `ready(options?)` | Wait for the native bridge to be injected. Options: `timeoutMs` (default 3000), `pollIntervalMs` (default 50) |\n| `invoke<T>(method, params?)` | Call a C# method by fully-qualified name (e.g. `ServiceName.MethodName`) |\n| `getService<T>(name)` | Create a typed proxy for a C# service |\n| `use(middleware)` | Add a middleware to the pipeline |\n\n### Built-in Middlewares\n\n| Middleware | Description |\n|---|---|\n| `withLogging(options?)` | Log bridge calls with timing. Options: `logger`, `maxParamLength` |\n| `withTimeout(ms)` | Reject calls that exceed the timeout |\n| `withRetry(options)` | Retry failed calls. Options: `maxRetries`, `delay`, `retryOn` |\n| `withErrorNormalization()` | Convert raw RPC error objects to `BridgeError` instances |\n\n## How It Works\n\nThis package is the JavaScript side of the Agibuild.Fulora bridge. On the C# side, services decorated with `[JsExport]` are exposed via a JSON-RPC transport injected into the WebView as `window.agWebView.rpc`. This package provides a typed client that calls those services and supports middleware for cross-cutting concerns.\n\n```\n┌─────────────────────┐          ┌─────────────────────┐\n│   Web App (JS/TS)   │          │   .NET Host (C#)    │\n│                     │          │                     │\n│  bridge.getService  │──JSON──▶│  [JsExport] Service │\n│  bridge.invoke      │   RPC   │  Bridge Runtime      │\n│  bridge.use(mw)     │◀──────── │  Source Generator    │\n└─────────────────────┘          └─────────────────────┘\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}