@cavi-ai/api-client 0.1.0
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/ARCHITECTURE.md +12 -0
- package/CHANGELOG.md +80 -0
- package/CONTRIBUTING.md +158 -0
- package/LICENSE +21 -0
- package/README.md +618 -0
- package/SECURITY.md +48 -0
- package/dist/contracts/index.d.ts +5 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +4 -0
- package/dist/contracts/paths.d.ts +154 -0
- package/dist/contracts/paths.d.ts.map +1 -0
- package/dist/contracts/paths.js +89 -0
- package/dist/contracts/resolve.d.ts +7 -0
- package/dist/contracts/resolve.d.ts.map +1 -0
- package/dist/contracts/resolve.js +22 -0
- package/dist/contracts/surfaces.d.ts +13 -0
- package/dist/contracts/surfaces.d.ts.map +1 -0
- package/dist/contracts/surfaces.js +332 -0
- package/dist/contracts/team-manifest.d.ts +200 -0
- package/dist/contracts/team-manifest.d.ts.map +1 -0
- package/dist/contracts/team-manifest.js +951 -0
- package/dist/core/data/guards.d.ts +6 -0
- package/dist/core/data/guards.d.ts.map +1 -0
- package/dist/core/data/guards.js +22 -0
- package/dist/core/data/index.d.ts +2 -0
- package/dist/core/data/index.d.ts.map +1 -0
- package/dist/core/data/index.js +1 -0
- package/dist/core/env/config.d.ts +40 -0
- package/dist/core/env/config.d.ts.map +1 -0
- package/dist/core/env/config.js +44 -0
- package/dist/core/env/index.d.ts +3 -0
- package/dist/core/env/index.d.ts.map +1 -0
- package/dist/core/env/index.js +2 -0
- package/dist/core/env/repo-root.d.ts +11 -0
- package/dist/core/env/repo-root.d.ts.map +1 -0
- package/dist/core/env/repo-root.js +36 -0
- package/dist/core/gateway/agent/commands.d.ts +93 -0
- package/dist/core/gateway/agent/commands.d.ts.map +1 -0
- package/dist/core/gateway/agent/commands.js +351 -0
- package/dist/core/gateway/agent/config.d.ts +158 -0
- package/dist/core/gateway/agent/config.d.ts.map +1 -0
- package/dist/core/gateway/agent/config.js +536 -0
- package/dist/core/gateway/agent/index.d.ts +4 -0
- package/dist/core/gateway/agent/index.d.ts.map +1 -0
- package/dist/core/gateway/agent/index.js +3 -0
- package/dist/core/gateway/agent/voice-config.d.ts +20 -0
- package/dist/core/gateway/agent/voice-config.d.ts.map +1 -0
- package/dist/core/gateway/agent/voice-config.js +65 -0
- package/dist/core/gateway/client/capabilities.d.ts +28 -0
- package/dist/core/gateway/client/capabilities.d.ts.map +1 -0
- package/dist/core/gateway/client/capabilities.js +288 -0
- package/dist/core/gateway/client/client.d.ts +106 -0
- package/dist/core/gateway/client/client.d.ts.map +1 -0
- package/dist/core/gateway/client/client.js +41 -0
- package/dist/core/gateway/client/error-details.d.ts +17 -0
- package/dist/core/gateway/client/error-details.d.ts.map +1 -0
- package/dist/core/gateway/client/error-details.js +50 -0
- package/dist/core/gateway/client/fetch.d.ts +24 -0
- package/dist/core/gateway/client/fetch.d.ts.map +1 -0
- package/dist/core/gateway/client/fetch.js +98 -0
- package/dist/core/gateway/client/index.d.ts +6 -0
- package/dist/core/gateway/client/index.d.ts.map +1 -0
- package/dist/core/gateway/client/index.js +5 -0
- package/dist/core/gateway/client/runtime-targets.d.ts +11 -0
- package/dist/core/gateway/client/runtime-targets.d.ts.map +1 -0
- package/dist/core/gateway/client/runtime-targets.js +86 -0
- package/dist/core/gateway/envelope/envelope.d.ts +25 -0
- package/dist/core/gateway/envelope/envelope.d.ts.map +1 -0
- package/dist/core/gateway/envelope/envelope.js +141 -0
- package/dist/core/gateway/envelope/index.d.ts +3 -0
- package/dist/core/gateway/envelope/index.d.ts.map +1 -0
- package/dist/core/gateway/envelope/index.js +1 -0
- package/dist/core/gateway/envelope/types.d.ts +32 -0
- package/dist/core/gateway/envelope/types.d.ts.map +1 -0
- package/dist/core/gateway/envelope/types.js +1 -0
- package/dist/core/gateway/index.d.ts +11 -0
- package/dist/core/gateway/index.d.ts.map +1 -0
- package/dist/core/gateway/index.js +10 -0
- package/dist/core/gateway/jobs.d.ts +44 -0
- package/dist/core/gateway/jobs.d.ts.map +1 -0
- package/dist/core/gateway/jobs.js +104 -0
- package/dist/core/gateway/portal/config-patch.d.ts +42 -0
- package/dist/core/gateway/portal/config-patch.d.ts.map +1 -0
- package/dist/core/gateway/portal/config-patch.js +99 -0
- package/dist/core/gateway/portal/index.d.ts +2 -0
- package/dist/core/gateway/portal/index.d.ts.map +1 -0
- package/dist/core/gateway/portal/index.js +1 -0
- package/dist/core/gateway/providers/factory.d.ts +18 -0
- package/dist/core/gateway/providers/factory.d.ts.map +1 -0
- package/dist/core/gateway/providers/factory.js +40 -0
- package/dist/core/gateway/providers/index.d.ts +5 -0
- package/dist/core/gateway/providers/index.d.ts.map +1 -0
- package/dist/core/gateway/providers/index.js +4 -0
- package/dist/core/gateway/providers/normalize.d.ts +2 -0
- package/dist/core/gateway/providers/normalize.d.ts.map +1 -0
- package/dist/core/gateway/providers/normalize.js +6 -0
- package/dist/core/gateway/providers/registry.d.ts +5 -0
- package/dist/core/gateway/providers/registry.d.ts.map +1 -0
- package/dist/core/gateway/providers/registry.js +76 -0
- package/dist/core/gateway/providers/types.d.ts +42 -0
- package/dist/core/gateway/providers/types.d.ts.map +1 -0
- package/dist/core/gateway/providers/types.js +4 -0
- package/dist/core/gateway/resources/index.d.ts +3 -0
- package/dist/core/gateway/resources/index.d.ts.map +1 -0
- package/dist/core/gateway/resources/index.js +2 -0
- package/dist/core/gateway/resources/media.d.ts +165 -0
- package/dist/core/gateway/resources/media.d.ts.map +1 -0
- package/dist/core/gateway/resources/media.js +170 -0
- package/dist/core/gateway/resources/wiki.d.ts +136 -0
- package/dist/core/gateway/resources/wiki.d.ts.map +1 -0
- package/dist/core/gateway/resources/wiki.js +72 -0
- package/dist/core/gateway/rpc/client.d.ts +150 -0
- package/dist/core/gateway/rpc/client.d.ts.map +1 -0
- package/dist/core/gateway/rpc/client.js +675 -0
- package/dist/core/gateway/rpc/device-crypto.d.ts +19 -0
- package/dist/core/gateway/rpc/device-crypto.d.ts.map +1 -0
- package/dist/core/gateway/rpc/device-crypto.js +75 -0
- package/dist/core/gateway/rpc/device-store.d.ts +8 -0
- package/dist/core/gateway/rpc/device-store.d.ts.map +1 -0
- package/dist/core/gateway/rpc/device-store.js +113 -0
- package/dist/core/gateway/rpc/error.d.ts +5 -0
- package/dist/core/gateway/rpc/error.d.ts.map +1 -0
- package/dist/core/gateway/rpc/error.js +9 -0
- package/dist/core/gateway/rpc/index.d.ts +6 -0
- package/dist/core/gateway/rpc/index.d.ts.map +1 -0
- package/dist/core/gateway/rpc/index.js +5 -0
- package/dist/core/gateway/rpc/preauth-handshake.d.ts +39 -0
- package/dist/core/gateway/rpc/preauth-handshake.d.ts.map +1 -0
- package/dist/core/gateway/rpc/preauth-handshake.js +58 -0
- package/dist/core/gateway/run/contracts.d.ts +126 -0
- package/dist/core/gateway/run/contracts.d.ts.map +1 -0
- package/dist/core/gateway/run/contracts.js +23 -0
- package/dist/core/gateway/run/event-stream.d.ts +106 -0
- package/dist/core/gateway/run/event-stream.d.ts.map +1 -0
- package/dist/core/gateway/run/event-stream.js +264 -0
- package/dist/core/gateway/run/index.d.ts +5 -0
- package/dist/core/gateway/run/index.d.ts.map +1 -0
- package/dist/core/gateway/run/index.js +4 -0
- package/dist/core/gateway/run/sse-run-event-provider.d.ts +55 -0
- package/dist/core/gateway/run/sse-run-event-provider.d.ts.map +1 -0
- package/dist/core/gateway/run/sse-run-event-provider.js +394 -0
- package/dist/core/gateway/run/stream-failure.d.ts +11 -0
- package/dist/core/gateway/run/stream-failure.d.ts.map +1 -0
- package/dist/core/gateway/run/stream-failure.js +101 -0
- package/dist/core/gateway/snapshots/cache.d.ts +7 -0
- package/dist/core/gateway/snapshots/cache.d.ts.map +1 -0
- package/dist/core/gateway/snapshots/cache.js +13 -0
- package/dist/core/gateway/snapshots/contracts.d.ts +279 -0
- package/dist/core/gateway/snapshots/contracts.d.ts.map +1 -0
- package/dist/core/gateway/snapshots/contracts.js +1 -0
- package/dist/core/gateway/snapshots/index.d.ts +7 -0
- package/dist/core/gateway/snapshots/index.d.ts.map +1 -0
- package/dist/core/gateway/snapshots/index.js +6 -0
- package/dist/core/gateway/snapshots/loaders.d.ts +76 -0
- package/dist/core/gateway/snapshots/loaders.d.ts.map +1 -0
- package/dist/core/gateway/snapshots/loaders.js +515 -0
- package/dist/core/gateway/snapshots/session-loaders.d.ts +116 -0
- package/dist/core/gateway/snapshots/session-loaders.d.ts.map +1 -0
- package/dist/core/gateway/snapshots/session-loaders.js +310 -0
- package/dist/core/gateway/snapshots/system-loaders.d.ts +16 -0
- package/dist/core/gateway/snapshots/system-loaders.d.ts.map +1 -0
- package/dist/core/gateway/snapshots/system-loaders.js +61 -0
- package/dist/core/gateway/snapshots/transforms.d.ts +38 -0
- package/dist/core/gateway/snapshots/transforms.d.ts.map +1 -0
- package/dist/core/gateway/snapshots/transforms.js +328 -0
- package/dist/core/http/client-id.d.ts +6 -0
- package/dist/core/http/client-id.d.ts.map +1 -0
- package/dist/core/http/client-id.js +29 -0
- package/dist/core/http/client.d.ts +25 -0
- package/dist/core/http/client.d.ts.map +1 -0
- package/dist/core/http/client.js +234 -0
- package/dist/core/http/contracts.d.ts +3 -0
- package/dist/core/http/contracts.d.ts.map +1 -0
- package/dist/core/http/contracts.js +5 -0
- package/dist/core/http/errors.d.ts +17 -0
- package/dist/core/http/errors.d.ts.map +1 -0
- package/dist/core/http/errors.js +16 -0
- package/dist/core/http/gateway-error.d.ts +15 -0
- package/dist/core/http/gateway-error.d.ts.map +1 -0
- package/dist/core/http/gateway-error.js +15 -0
- package/dist/core/http/index.d.ts +10 -0
- package/dist/core/http/index.d.ts.map +1 -0
- package/dist/core/http/index.js +9 -0
- package/dist/core/http/json-client.d.ts +17 -0
- package/dist/core/http/json-client.d.ts.map +1 -0
- package/dist/core/http/json-client.js +62 -0
- package/dist/core/http/raw-client.d.ts +16 -0
- package/dist/core/http/raw-client.d.ts.map +1 -0
- package/dist/core/http/raw-client.js +36 -0
- package/dist/core/http/redaction.d.ts +20 -0
- package/dist/core/http/redaction.d.ts.map +1 -0
- package/dist/core/http/redaction.js +58 -0
- package/dist/core/http/types.d.ts +44 -0
- package/dist/core/http/types.d.ts.map +1 -0
- package/dist/core/http/types.js +3 -0
- package/dist/core/runtime/index.d.ts +2 -0
- package/dist/core/runtime/index.d.ts.map +1 -0
- package/dist/core/runtime/index.js +1 -0
- package/dist/core/runtime/paths.d.ts +5 -0
- package/dist/core/runtime/paths.d.ts.map +1 -0
- package/dist/core/runtime/paths.js +29 -0
- package/dist/core/sse/index.d.ts +2 -0
- package/dist/core/sse/index.d.ts.map +1 -0
- package/dist/core/sse/index.js +1 -0
- package/dist/core/sse/stream.d.ts +17 -0
- package/dist/core/sse/stream.d.ts.map +1 -0
- package/dist/core/sse/stream.js +106 -0
- package/dist/core/ws/close.d.ts +11 -0
- package/dist/core/ws/close.d.ts.map +1 -0
- package/dist/core/ws/close.js +34 -0
- package/dist/core/ws/gateway-websocket.d.ts +2 -0
- package/dist/core/ws/gateway-websocket.d.ts.map +1 -0
- package/dist/core/ws/gateway-websocket.js +1 -0
- package/dist/core/ws/index.d.ts +4 -0
- package/dist/core/ws/index.d.ts.map +1 -0
- package/dist/core/ws/index.js +3 -0
- package/dist/core/ws/targets.d.ts +21 -0
- package/dist/core/ws/targets.d.ts.map +1 -0
- package/dist/core/ws/targets.js +61 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.d.ts +21 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.d.ts.map +1 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.js +22 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.d.ts +30 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.d.ts.map +1 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.js +72 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/library-live.d.ts +4 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/library-live.d.ts.map +1 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/library-live.js +66 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.d.ts +7 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.d.ts.map +1 -0
- package/dist/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.js +318 -0
- package/dist/extensions/cavi/adapters/create-cavi-control-adapters.d.ts +88 -0
- package/dist/extensions/cavi/adapters/create-cavi-control-adapters.d.ts.map +1 -0
- package/dist/extensions/cavi/adapters/create-cavi-control-adapters.js +172 -0
- package/dist/extensions/cavi/client.d.ts +72 -0
- package/dist/extensions/cavi/client.d.ts.map +1 -0
- package/dist/extensions/cavi/client.js +19 -0
- package/dist/extensions/cavi/contracts/index.d.ts +6 -0
- package/dist/extensions/cavi/contracts/index.d.ts.map +1 -0
- package/dist/extensions/cavi/contracts/index.js +5 -0
- package/dist/extensions/cavi/contracts/mobile.d.ts +441 -0
- package/dist/extensions/cavi/contracts/mobile.d.ts.map +1 -0
- package/dist/extensions/cavi/contracts/mobile.js +467 -0
- package/dist/extensions/cavi/contracts/paths.d.ts +121 -0
- package/dist/extensions/cavi/contracts/paths.d.ts.map +1 -0
- package/dist/extensions/cavi/contracts/paths.js +197 -0
- package/dist/extensions/cavi/contracts/portals.d.ts +78 -0
- package/dist/extensions/cavi/contracts/portals.d.ts.map +1 -0
- package/dist/extensions/cavi/contracts/portals.js +70 -0
- package/dist/extensions/cavi/contracts/resolve.d.ts +3 -0
- package/dist/extensions/cavi/contracts/resolve.d.ts.map +1 -0
- package/dist/extensions/cavi/contracts/resolve.js +4 -0
- package/dist/extensions/cavi/contracts/surfaces.d.ts +5 -0
- package/dist/extensions/cavi/contracts/surfaces.d.ts.map +1 -0
- package/dist/extensions/cavi/contracts/surfaces.js +551 -0
- package/dist/extensions/cavi/discourse/contracts.d.ts +5 -0
- package/dist/extensions/cavi/discourse/contracts.d.ts.map +1 -0
- package/dist/extensions/cavi/discourse/contracts.js +7 -0
- package/dist/extensions/cavi/discourse/fallback.d.ts +3 -0
- package/dist/extensions/cavi/discourse/fallback.d.ts.map +1 -0
- package/dist/extensions/cavi/discourse/fallback.js +364 -0
- package/dist/extensions/cavi/discourse/live.d.ts +5 -0
- package/dist/extensions/cavi/discourse/live.d.ts.map +1 -0
- package/dist/extensions/cavi/discourse/live.js +22 -0
- package/dist/extensions/cavi/discourse/normalize-helpers.d.ts +11 -0
- package/dist/extensions/cavi/discourse/normalize-helpers.d.ts.map +1 -0
- package/dist/extensions/cavi/discourse/normalize-helpers.js +155 -0
- package/dist/extensions/cavi/discourse/normalize.d.ts +4 -0
- package/dist/extensions/cavi/discourse/normalize.d.ts.map +1 -0
- package/dist/extensions/cavi/discourse/normalize.js +287 -0
- package/dist/extensions/cavi/domain/discourse.d.ts +161 -0
- package/dist/extensions/cavi/domain/discourse.d.ts.map +1 -0
- package/dist/extensions/cavi/domain/discourse.js +1 -0
- package/dist/extensions/cavi/domain/index.d.ts +6 -0
- package/dist/extensions/cavi/domain/index.d.ts.map +1 -0
- package/dist/extensions/cavi/domain/index.js +5 -0
- package/dist/extensions/cavi/domain/library.d.ts +80 -0
- package/dist/extensions/cavi/domain/library.d.ts.map +1 -0
- package/dist/extensions/cavi/domain/library.js +2 -0
- package/dist/extensions/cavi/domain/observability.d.ts +34 -0
- package/dist/extensions/cavi/domain/observability.d.ts.map +1 -0
- package/dist/extensions/cavi/domain/observability.js +1 -0
- package/dist/extensions/cavi/domain/operator.d.ts +420 -0
- package/dist/extensions/cavi/domain/operator.d.ts.map +1 -0
- package/dist/extensions/cavi/domain/operator.js +1 -0
- package/dist/extensions/cavi/domain/project-board.d.ts +96 -0
- package/dist/extensions/cavi/domain/project-board.d.ts.map +1 -0
- package/dist/extensions/cavi/domain/project-board.js +1 -0
- package/dist/extensions/cavi/fallbacks/provider.d.ts +13 -0
- package/dist/extensions/cavi/fallbacks/provider.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/provider.js +23 -0
- package/dist/extensions/cavi/fallbacks/snapshots/agent-memory.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/agent-memory.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/agent-memory.js +6 -0
- package/dist/extensions/cavi/fallbacks/snapshots/cost-history.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/cost-history.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/cost-history.js +73 -0
- package/dist/extensions/cavi/fallbacks/snapshots/incidents.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/incidents.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/incidents.js +50 -0
- package/dist/extensions/cavi/fallbacks/snapshots/index.d.ts +10 -0
- package/dist/extensions/cavi/fallbacks/snapshots/index.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/index.js +9 -0
- package/dist/extensions/cavi/fallbacks/snapshots/library.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/library.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/library.js +110 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/defaults.d.ts +8 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/defaults.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/defaults.js +29 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/index.d.ts +4 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/index.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/index.js +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.js +63 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.js +716 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.js +38 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.js +84 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.js +111 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.js +16 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.js +43 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.js +16 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/transports.d.ts +4 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/transports.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/operator-control/transports.js +65 -0
- package/dist/extensions/cavi/fallbacks/snapshots/overview.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/overview.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/overview.js +40 -0
- package/dist/extensions/cavi/fallbacks/snapshots/routing.d.ts +3 -0
- package/dist/extensions/cavi/fallbacks/snapshots/routing.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/routing.js +36 -0
- package/dist/extensions/cavi/fallbacks/snapshots/runs.d.ts +4 -0
- package/dist/extensions/cavi/fallbacks/snapshots/runs.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/runs.js +133 -0
- package/dist/extensions/cavi/fallbacks/snapshots/shared.d.ts +2 -0
- package/dist/extensions/cavi/fallbacks/snapshots/shared.d.ts.map +1 -0
- package/dist/extensions/cavi/fallbacks/snapshots/shared.js +1 -0
- package/dist/extensions/cavi/index.d.ts +27 -0
- package/dist/extensions/cavi/index.d.ts.map +1 -0
- package/dist/extensions/cavi/index.js +26 -0
- package/dist/extensions/cavi/library/api.d.ts +18 -0
- package/dist/extensions/cavi/library/api.d.ts.map +1 -0
- package/dist/extensions/cavi/library/api.js +67 -0
- package/dist/extensions/cavi/library/client.d.ts +51 -0
- package/dist/extensions/cavi/library/client.d.ts.map +1 -0
- package/dist/extensions/cavi/library/client.js +23 -0
- package/dist/extensions/cavi/library/clip.d.ts +93 -0
- package/dist/extensions/cavi/library/clip.d.ts.map +1 -0
- package/dist/extensions/cavi/library/clip.js +272 -0
- package/dist/extensions/cavi/operator-control/constants.d.ts +4 -0
- package/dist/extensions/cavi/operator-control/constants.d.ts.map +1 -0
- package/dist/extensions/cavi/operator-control/constants.js +3 -0
- package/dist/extensions/cavi/operator-control/defaults.d.ts +11 -0
- package/dist/extensions/cavi/operator-control/defaults.d.ts.map +1 -0
- package/dist/extensions/cavi/operator-control/defaults.js +243 -0
- package/dist/extensions/cavi/operator-control/load-section.d.ts +24 -0
- package/dist/extensions/cavi/operator-control/load-section.d.ts.map +1 -0
- package/dist/extensions/cavi/operator-control/load-section.js +46 -0
- package/dist/extensions/cavi/portal/client.d.ts +16 -0
- package/dist/extensions/cavi/portal/client.d.ts.map +1 -0
- package/dist/extensions/cavi/portal/client.js +38 -0
- package/dist/extensions/cavi/portal/tts.d.ts +69 -0
- package/dist/extensions/cavi/portal/tts.d.ts.map +1 -0
- package/dist/extensions/cavi/portal/tts.js +116 -0
- package/dist/extensions/cavi/project-board/constants.d.ts +68 -0
- package/dist/extensions/cavi/project-board/constants.d.ts.map +1 -0
- package/dist/extensions/cavi/project-board/constants.js +9 -0
- package/dist/extensions/cavi/project-board/fallback.d.ts +3 -0
- package/dist/extensions/cavi/project-board/fallback.d.ts.map +1 -0
- package/dist/extensions/cavi/project-board/fallback.js +127 -0
- package/dist/extensions/cavi/project-board/live.d.ts +16 -0
- package/dist/extensions/cavi/project-board/live.d.ts.map +1 -0
- package/dist/extensions/cavi/project-board/live.js +86 -0
- package/dist/extensions/cavi/project-board/mutations.d.ts +43 -0
- package/dist/extensions/cavi/project-board/mutations.d.ts.map +1 -0
- package/dist/extensions/cavi/project-board/mutations.js +210 -0
- package/dist/extensions/cavi/project-board/normalize.d.ts +23 -0
- package/dist/extensions/cavi/project-board/normalize.d.ts.map +1 -0
- package/dist/extensions/cavi/project-board/normalize.js +410 -0
- package/dist/extensions/cavi/project-board/trace-id.d.ts +2 -0
- package/dist/extensions/cavi/project-board/trace-id.d.ts.map +1 -0
- package/dist/extensions/cavi/project-board/trace-id.js +7 -0
- package/dist/extensions/cavi/registry/canonical-team-registry.d.ts +41 -0
- package/dist/extensions/cavi/registry/canonical-team-registry.d.ts.map +1 -0
- package/dist/extensions/cavi/registry/canonical-team-registry.js +102 -0
- package/dist/extensions/cavi/registry/portal-library-registry.d.ts +6 -0
- package/dist/extensions/cavi/registry/portal-library-registry.d.ts.map +1 -0
- package/dist/extensions/cavi/registry/portal-library-registry.js +17 -0
- package/dist/extensions/cavi/registry/session-keys.d.ts +16 -0
- package/dist/extensions/cavi/registry/session-keys.d.ts.map +1 -0
- package/dist/extensions/cavi/registry/session-keys.js +68 -0
- package/dist/extensions/cavi/registry/team-registry-config.d.ts +6 -0
- package/dist/extensions/cavi/registry/team-registry-config.d.ts.map +1 -0
- package/dist/extensions/cavi/registry/team-registry-config.js +23 -0
- package/dist/extensions/cavi/registry/team-registry.d.ts +49 -0
- package/dist/extensions/cavi/registry/team-registry.d.ts.map +1 -0
- package/dist/extensions/cavi/registry/team-registry.js +290 -0
- package/dist/extensions/cavi/runtime/env-config.d.ts +35 -0
- package/dist/extensions/cavi/runtime/env-config.d.ts.map +1 -0
- package/dist/extensions/cavi/runtime/env-config.js +74 -0
- package/dist/extensions/cavi/runtime/paths.d.ts +11 -0
- package/dist/extensions/cavi/runtime/paths.d.ts.map +1 -0
- package/dist/extensions/cavi/runtime/paths.js +43 -0
- package/dist/extensions/cavi/runtime/standalone-mode.d.ts +3 -0
- package/dist/extensions/cavi/runtime/standalone-mode.d.ts.map +1 -0
- package/dist/extensions/cavi/runtime/standalone-mode.js +15 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/providers/hermes/agent-config.d.ts +36 -0
- package/dist/providers/hermes/agent-config.d.ts.map +1 -0
- package/dist/providers/hermes/agent-config.js +242 -0
- package/dist/providers/hermes/chat-run.d.ts +106 -0
- package/dist/providers/hermes/chat-run.d.ts.map +1 -0
- package/dist/providers/hermes/chat-run.js +221 -0
- package/dist/providers/hermes/client.d.ts +13 -0
- package/dist/providers/hermes/client.d.ts.map +1 -0
- package/dist/providers/hermes/client.js +6 -0
- package/dist/providers/hermes/env-config.d.ts +18 -0
- package/dist/providers/hermes/env-config.d.ts.map +1 -0
- package/dist/providers/hermes/env-config.js +38 -0
- package/dist/providers/hermes/index.d.ts +12 -0
- package/dist/providers/hermes/index.d.ts.map +1 -0
- package/dist/providers/hermes/index.js +11 -0
- package/dist/providers/hermes/media.d.ts +6 -0
- package/dist/providers/hermes/media.d.ts.map +1 -0
- package/dist/providers/hermes/media.js +10 -0
- package/dist/providers/hermes/provider-module.d.ts +3 -0
- package/dist/providers/hermes/provider-module.d.ts.map +1 -0
- package/dist/providers/hermes/provider-module.js +22 -0
- package/dist/providers/hermes/sse-run-event-provider.d.ts +24 -0
- package/dist/providers/hermes/sse-run-event-provider.d.ts.map +1 -0
- package/dist/providers/hermes/sse-run-event-provider.js +32 -0
- package/dist/providers/hermes/team-registry-config.d.ts +3 -0
- package/dist/providers/hermes/team-registry-config.d.ts.map +1 -0
- package/dist/providers/hermes/team-registry-config.js +1 -0
- package/dist/providers/hermes/team-registry.d.ts +3 -0
- package/dist/providers/hermes/team-registry.d.ts.map +1 -0
- package/dist/providers/hermes/team-registry.js +5 -0
- package/dist/providers/hermes/websocket.d.ts +6 -0
- package/dist/providers/hermes/websocket.d.ts.map +1 -0
- package/dist/providers/hermes/websocket.js +6 -0
- package/dist/providers/hermes/wiki.d.ts +6 -0
- package/dist/providers/hermes/wiki.d.ts.map +1 -0
- package/dist/providers/hermes/wiki.js +10 -0
- package/dist/providers/openclaw/agent-config.d.ts +6 -0
- package/dist/providers/openclaw/agent-config.d.ts.map +1 -0
- package/dist/providers/openclaw/agent-config.js +10 -0
- package/dist/providers/openclaw/client.d.ts +13 -0
- package/dist/providers/openclaw/client.d.ts.map +1 -0
- package/dist/providers/openclaw/client.js +6 -0
- package/dist/providers/openclaw/index.d.ts +10 -0
- package/dist/providers/openclaw/index.d.ts.map +1 -0
- package/dist/providers/openclaw/index.js +9 -0
- package/dist/providers/openclaw/media.d.ts +6 -0
- package/dist/providers/openclaw/media.d.ts.map +1 -0
- package/dist/providers/openclaw/media.js +10 -0
- package/dist/providers/openclaw/provider-module.d.ts +3 -0
- package/dist/providers/openclaw/provider-module.d.ts.map +1 -0
- package/dist/providers/openclaw/provider-module.js +16 -0
- package/dist/providers/openclaw/sse-run-event-provider.d.ts +6 -0
- package/dist/providers/openclaw/sse-run-event-provider.d.ts.map +1 -0
- package/dist/providers/openclaw/sse-run-event-provider.js +10 -0
- package/dist/providers/openclaw/team-registry-config.d.ts +3 -0
- package/dist/providers/openclaw/team-registry-config.d.ts.map +1 -0
- package/dist/providers/openclaw/team-registry-config.js +1 -0
- package/dist/providers/openclaw/team-registry.d.ts +3 -0
- package/dist/providers/openclaw/team-registry.d.ts.map +1 -0
- package/dist/providers/openclaw/team-registry.js +5 -0
- package/dist/providers/openclaw/websocket.d.ts +6 -0
- package/dist/providers/openclaw/websocket.d.ts.map +1 -0
- package/dist/providers/openclaw/websocket.js +28 -0
- package/dist/providers/openclaw/wiki.d.ts +6 -0
- package/dist/providers/openclaw/wiki.d.ts.map +1 -0
- package/dist/providers/openclaw/wiki.js +10 -0
- package/dist/react/gateway-provider.d.ts +142 -0
- package/dist/react/gateway-provider.d.ts.map +1 -0
- package/dist/react/gateway-provider.js +569 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +1 -0
- package/docs/assets/api-client-hero.svg +73 -0
- package/docs/cavi-team-manifest.example.ts +219 -0
- package/docs/team-manifest.consumer.template.ts +248 -0
- package/docs/team-manifest.md +252 -0
- package/package.json +152 -0
- package/src/contracts/index.ts +4 -0
- package/src/contracts/paths.ts +126 -0
- package/src/contracts/resolve.ts +42 -0
- package/src/contracts/surfaces.ts +366 -0
- package/src/contracts/team-manifest.ts +1402 -0
- package/src/core/data/guards.ts +26 -0
- package/src/core/data/index.ts +1 -0
- package/src/core/env/config.ts +97 -0
- package/src/core/env/index.ts +2 -0
- package/src/core/env/repo-root.ts +59 -0
- package/src/core/gateway/README.md +35 -0
- package/src/core/gateway/agent/commands.ts +482 -0
- package/src/core/gateway/agent/config.ts +786 -0
- package/src/core/gateway/agent/index.ts +3 -0
- package/src/core/gateway/agent/voice-config.ts +91 -0
- package/src/core/gateway/client/capabilities.ts +385 -0
- package/src/core/gateway/client/client.ts +137 -0
- package/src/core/gateway/client/error-details.ts +74 -0
- package/src/core/gateway/client/fetch.ts +180 -0
- package/src/core/gateway/client/index.ts +5 -0
- package/src/core/gateway/client/runtime-targets.ts +132 -0
- package/src/core/gateway/envelope/envelope.ts +204 -0
- package/src/core/gateway/envelope/index.ts +2 -0
- package/src/core/gateway/envelope/types.ts +48 -0
- package/src/core/gateway/index.ts +10 -0
- package/src/core/gateway/jobs.ts +178 -0
- package/src/core/gateway/portal/config-patch.ts +136 -0
- package/src/core/gateway/portal/index.ts +1 -0
- package/src/core/gateway/providers/factory.ts +77 -0
- package/src/core/gateway/providers/index.ts +4 -0
- package/src/core/gateway/providers/normalize.ts +7 -0
- package/src/core/gateway/providers/registry.ts +96 -0
- package/src/core/gateway/providers/types.ts +73 -0
- package/src/core/gateway/resources/index.ts +2 -0
- package/src/core/gateway/resources/media.ts +474 -0
- package/src/core/gateway/resources/wiki.ts +301 -0
- package/src/core/gateway/rpc/client.ts +1067 -0
- package/src/core/gateway/rpc/device-crypto.ts +101 -0
- package/src/core/gateway/rpc/device-store.ts +147 -0
- package/src/core/gateway/rpc/error.ts +11 -0
- package/src/core/gateway/rpc/index.ts +5 -0
- package/src/core/gateway/rpc/preauth-handshake.ts +99 -0
- package/src/core/gateway/run/contracts.ts +155 -0
- package/src/core/gateway/run/event-stream.ts +373 -0
- package/src/core/gateway/run/index.ts +4 -0
- package/src/core/gateway/run/sse-run-event-provider.ts +513 -0
- package/src/core/gateway/run/stream-failure.ts +135 -0
- package/src/core/gateway/snapshots/cache.ts +22 -0
- package/src/core/gateway/snapshots/contracts.ts +293 -0
- package/src/core/gateway/snapshots/index.ts +6 -0
- package/src/core/gateway/snapshots/loaders.ts +738 -0
- package/src/core/gateway/snapshots/session-loaders.ts +534 -0
- package/src/core/gateway/snapshots/system-loaders.ts +93 -0
- package/src/core/gateway/snapshots/transforms.ts +508 -0
- package/src/core/http/client-id.ts +40 -0
- package/src/core/http/client.ts +271 -0
- package/src/core/http/contracts.ts +9 -0
- package/src/core/http/errors.ts +26 -0
- package/src/core/http/gateway-error.ts +38 -0
- package/src/core/http/index.ts +9 -0
- package/src/core/http/json-client.ts +90 -0
- package/src/core/http/raw-client.ts +57 -0
- package/src/core/http/redaction.ts +78 -0
- package/src/core/http/types.ts +59 -0
- package/src/core/runtime/index.ts +1 -0
- package/src/core/runtime/paths.ts +44 -0
- package/src/core/sse/index.ts +1 -0
- package/src/core/sse/stream.ts +118 -0
- package/src/core/ws/close.ts +51 -0
- package/src/core/ws/gateway-websocket.ts +8 -0
- package/src/core/ws/index.ts +3 -0
- package/src/core/ws/targets.ts +74 -0
- package/src/extensions/README.md +16 -0
- package/src/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.ts +33 -0
- package/src/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.ts +152 -0
- package/src/extensions/cavi/adapters/cavi-control-adapters/library-live.ts +120 -0
- package/src/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.ts +422 -0
- package/src/extensions/cavi/adapters/create-cavi-control-adapters.ts +350 -0
- package/src/extensions/cavi/client.ts +25 -0
- package/src/extensions/cavi/contracts/index.ts +5 -0
- package/src/extensions/cavi/contracts/mobile.ts +528 -0
- package/src/extensions/cavi/contracts/paths.ts +242 -0
- package/src/extensions/cavi/contracts/portals.ts +165 -0
- package/src/extensions/cavi/contracts/resolve.ts +6 -0
- package/src/extensions/cavi/contracts/surfaces.ts +567 -0
- package/src/extensions/cavi/discourse/contracts.ts +9 -0
- package/src/extensions/cavi/discourse/fallback.ts +387 -0
- package/src/extensions/cavi/discourse/live.ts +36 -0
- package/src/extensions/cavi/discourse/normalize-helpers.ts +202 -0
- package/src/extensions/cavi/discourse/normalize.ts +415 -0
- package/src/extensions/cavi/domain/discourse.ts +209 -0
- package/src/extensions/cavi/domain/index.ts +5 -0
- package/src/extensions/cavi/domain/library.ts +96 -0
- package/src/extensions/cavi/domain/observability.ts +36 -0
- package/src/extensions/cavi/domain/operator.ts +486 -0
- package/src/extensions/cavi/domain/project-board.ts +107 -0
- package/src/extensions/cavi/fallbacks/provider.ts +57 -0
- package/src/extensions/cavi/fallbacks/snapshots/agent-memory.ts +8 -0
- package/src/extensions/cavi/fallbacks/snapshots/cost-history.ts +101 -0
- package/src/extensions/cavi/fallbacks/snapshots/incidents.ts +56 -0
- package/src/extensions/cavi/fallbacks/snapshots/index.ts +9 -0
- package/src/extensions/cavi/fallbacks/snapshots/library.ts +112 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/defaults.ts +57 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/index.ts +3 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.ts +65 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.ts +735 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.ts +41 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.ts +87 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.ts +113 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.ts +19 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.ts +46 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.ts +18 -0
- package/src/extensions/cavi/fallbacks/snapshots/operator-control/transports.ts +81 -0
- package/src/extensions/cavi/fallbacks/snapshots/overview.ts +42 -0
- package/src/extensions/cavi/fallbacks/snapshots/routing.ts +38 -0
- package/src/extensions/cavi/fallbacks/snapshots/runs.ts +141 -0
- package/src/extensions/cavi/fallbacks/snapshots/shared.ts +1 -0
- package/src/extensions/cavi/index.ts +52 -0
- package/src/extensions/cavi/library/api.ts +120 -0
- package/src/extensions/cavi/library/client.ts +54 -0
- package/src/extensions/cavi/library/clip.ts +389 -0
- package/src/extensions/cavi/operator-control/constants.ts +3 -0
- package/src/extensions/cavi/operator-control/defaults.ts +254 -0
- package/src/extensions/cavi/operator-control/load-section.ts +92 -0
- package/src/extensions/cavi/portal/client.ts +63 -0
- package/src/extensions/cavi/portal/tts.ts +213 -0
- package/src/extensions/cavi/project-board/constants.ts +84 -0
- package/src/extensions/cavi/project-board/fallback.ts +129 -0
- package/src/extensions/cavi/project-board/live.ts +121 -0
- package/src/extensions/cavi/project-board/mutations.ts +306 -0
- package/src/extensions/cavi/project-board/normalize.ts +552 -0
- package/src/extensions/cavi/project-board/trace-id.ts +9 -0
- package/src/extensions/cavi/registry/canonical-team-registry.ts +193 -0
- package/src/extensions/cavi/registry/portal-library-registry.ts +24 -0
- package/src/extensions/cavi/registry/session-keys.ts +92 -0
- package/src/extensions/cavi/registry/team-registry-config.ts +36 -0
- package/src/extensions/cavi/registry/team-registry.ts +414 -0
- package/src/extensions/cavi/runtime/env-config.ts +114 -0
- package/src/extensions/cavi/runtime/paths.ts +82 -0
- package/src/extensions/cavi/runtime/standalone-mode.ts +28 -0
- package/src/index.ts +576 -0
- package/src/providers/hermes/agent-config.ts +322 -0
- package/src/providers/hermes/chat-run.ts +340 -0
- package/src/providers/hermes/client.ts +21 -0
- package/src/providers/hermes/env-config.ts +58 -0
- package/src/providers/hermes/index.ts +11 -0
- package/src/providers/hermes/media.ts +12 -0
- package/src/providers/hermes/provider-module.ts +26 -0
- package/src/providers/hermes/sse-run-event-provider.ts +47 -0
- package/src/providers/hermes/team-registry-config.ts +2 -0
- package/src/providers/hermes/team-registry.ts +12 -0
- package/src/providers/hermes/websocket.ts +16 -0
- package/src/providers/hermes/wiki.ts +12 -0
- package/src/providers/openclaw/agent-config.ts +12 -0
- package/src/providers/openclaw/client.ts +21 -0
- package/src/providers/openclaw/index.ts +9 -0
- package/src/providers/openclaw/media.ts +12 -0
- package/src/providers/openclaw/provider-module.ts +20 -0
- package/src/providers/openclaw/sse-run-event-provider.ts +16 -0
- package/src/providers/openclaw/team-registry-config.ts +2 -0
- package/src/providers/openclaw/team-registry.ts +12 -0
- package/src/providers/openclaw/websocket.ts +56 -0
- package/src/providers/openclaw/wiki.ts +12 -0
- package/src/react/gateway-provider.tsx +835 -0
- package/src/react/index.ts +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
# @cavi-ai/api-client
|
|
2
|
+
|
|
3
|
+
**One gateway-agnostic TypeScript client for agent runtimes.** HTTP, WebSocket RPC, SSE, media, wiki, team routing, React hooks, and CAVI control adapters behind one clean package boundary.
|
|
4
|
+
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://github.com/sasan1200/cavi-api-client/actions/workflows/ci.yml)
|
|
7
|
+

|
|
8
|
+

|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<img src="docs/assets/api-client-hero.svg" alt="@cavi-ai/api-client gateway-agnostic architecture diagram" width="100%">
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
npm install @cavi-ai/api-client
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
> Prefer to import it as `@cavi/api-client`? Alias it on install — the import path is then yours, no code changes needed:
|
|
20
|
+
>
|
|
21
|
+
> ```sh
|
|
22
|
+
> npm install @cavi/api-client@npm:@cavi-ai/api-client
|
|
23
|
+
> # or: pnpm add @cavi/api-client@npm:@cavi-ai/api-client
|
|
24
|
+
> ```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## The Shape
|
|
29
|
+
|
|
30
|
+
If you build frontends against agent runtimes, you have probably lived this:
|
|
31
|
+
|
|
32
|
+
You start with one gateway. You write a `fetch` wrapper for it: bearer auth, a base URL, JSON parsing, error handling. Then you need streaming, so you write an SSE parser. Then a WebSocket RPC client for live data. You define route strings. You add fallback data so the dashboard does not explode when the backend hiccups.
|
|
33
|
+
|
|
34
|
+
Then another harness shows up: a different gateway, slightly different routes, a different run-stream shape. Copying the whole thing creates two auth wrappers, two run-stream parsers, two sets of path constants, two fallback strategies, drifting in two repos. A third runtime makes it three. Mobile makes it six.
|
|
35
|
+
|
|
36
|
+
Every surface re-solves the same plumbing, slightly differently, and the differences are exactly the bugs.
|
|
37
|
+
|
|
38
|
+
**`@cavi-ai/api-client` is the shared contract for that boundary.** It is the bridge layer between agent harnesses and the workspaces, UIs, and gateways that consume them:
|
|
39
|
+
|
|
40
|
+
- **One client interface**, gateway-agnostic at the core. HTTP REST and WebSocket RPC live behind the same shapes.
|
|
41
|
+
- **Thin provider adapters** (Hermes, OpenClaw, or your own) that override only what is actually different: headers, endpoint maps, default surfaces. The transport, RPC protocol, retry semantics, and trace behavior are written once.
|
|
42
|
+
- **Path contracts** so route strings live in exactly one place, never scattered through clients and components.
|
|
43
|
+
- **A declarative team manifest** so team / member / workspace / action routing is data your app supplies at runtime, not constants baked into the package.
|
|
44
|
+
- **Graceful degradation as a contract** — when a backend fails, loaders return a typed `DataEnvelope` with fallback data and a structured `contractGap` instead of throwing, so a flaky gateway degrades a panel instead of taking down the page.
|
|
45
|
+
|
|
46
|
+
The goal is simple: **you spend your time on the workflows you want, not the plumbing you don't.** Adding a new provider or a new feature should be additive — a small module, not a fork.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## What you get
|
|
51
|
+
|
|
52
|
+
| You need… | Use… |
|
|
53
|
+
| --- | --- |
|
|
54
|
+
| Authenticated JSON HTTP with timeouts, tracing, typed errors | `BaseHttpApiClient`, `JsonHttpApiClient`, `HttpApiError` |
|
|
55
|
+
| Agent runs + capabilities, gateway-agnostic | `GatewayApiClient`, `createGatewayApiClient` |
|
|
56
|
+
| Live data over WebSocket RPC | `GatewayRpcClient`, `createGatewayWebSocketClient` |
|
|
57
|
+
| Streaming run events (SSE) | `GatewaySseRunEventProvider`, `createGatewaySseRunEventProvider` |
|
|
58
|
+
| Generated audio / images / video / music / TTS | `GatewayMediaApiClient`, `createGatewayMediaClient` |
|
|
59
|
+
| Obsidian/QMD wiki vault ops | `GatewayWikiApiClient`, `createGatewayWikiClient` |
|
|
60
|
+
| Slash-command / mention UI from `/v1/capabilities` | `extractGatewayCommandCatalog`, `buildAgentSlashShortcuts` |
|
|
61
|
+
| React context + hooks for a live gateway client | `GatewayClientProvider`, `useGatewayClient`, `useGatewayEvents` |
|
|
62
|
+
| Dashboard loaders with HTTP + WS + mock fallback | `createCaviControlAdapters` |
|
|
63
|
+
| Route strings in one owned place | `CAVI_CONTROL_API_ENDPOINTS`, `GATEWAY_API_ENDPOINTS`, `resolvePath` |
|
|
64
|
+
| Runtime-supplied team / workspace / action routing | `normalizeTeamManifest`, `resolvePath`, `resolveTeamWorkspaceApiPath` |
|
|
65
|
+
| Register a new gateway provider without forking | `createGatewayProviderRegistry`, `GatewayProviderModule` |
|
|
66
|
+
|
|
67
|
+
Full export catalog is in [Reference](#reference) below.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Runtime
|
|
72
|
+
|
|
73
|
+
- Pure **ESM** package, ships compiled `dist/` with type declarations.
|
|
74
|
+
- Requires **Node.js `>=20`** (or any modern runtime with `fetch`, `WebSocket`).
|
|
75
|
+
- **Zero runtime dependencies.** React is an *optional* peer dependency — only the `@cavi-ai/api-client/react` entry needs it.
|
|
76
|
+
- Uses the platform `fetch` by default. Pass `fetchImpl` when a runtime needs an explicit implementation.
|
|
77
|
+
|
|
78
|
+
The package exposes **subpath exports** so you import only the slice you need:
|
|
79
|
+
`@cavi-ai/api-client` (root), `./core/http`, `./core/data`, `./core/runtime`, `./core/sse`, `./core/ws`, `./core/gateway`, `./core/env`, `./contracts`, `./extensions/cavi`, `./providers/hermes`, `./providers/openclaw`, `./react`.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 30-second quickstart
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import {
|
|
87
|
+
createGatewayApiClient,
|
|
88
|
+
CaviControlApiClient,
|
|
89
|
+
HttpApiError,
|
|
90
|
+
OPENCLAW_PROVIDER_MODULE,
|
|
91
|
+
} from "@cavi-ai/api-client";
|
|
92
|
+
|
|
93
|
+
const auth = {
|
|
94
|
+
bearerToken: process.env.GATEWAY_API_AUTH_TOKEN,
|
|
95
|
+
clientId: "my-dashboard",
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// Pick a provider; the returned client is the same gateway-agnostic shape.
|
|
99
|
+
const gateway = createGatewayApiClient(
|
|
100
|
+
{ baseUrl: "https://gateway.example.com", auth },
|
|
101
|
+
{ provider: "openclaw", providerModules: [OPENCLAW_PROVIDER_MODULE] },
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
const run = await gateway.startRun({
|
|
105
|
+
input: "Summarize the latest operator state.",
|
|
106
|
+
session_id: "operator-dashboard",
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Domain-shaped HTTP for CAVI Control surfaces.
|
|
110
|
+
const cavi = new CaviControlApiClient({
|
|
111
|
+
baseUrl: "https://control.example.com",
|
|
112
|
+
auth,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
try {
|
|
116
|
+
const snapshot = await cavi.getOperatorSnapshot();
|
|
117
|
+
console.log(snapshot);
|
|
118
|
+
} catch (error) {
|
|
119
|
+
if (error instanceof HttpApiError) {
|
|
120
|
+
console.error(error.status, error.path, error.body);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
That is the whole mental model: **pick a provider, get a client, call methods.** Everything below is detail you reach for when you need it.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Core concepts
|
|
130
|
+
|
|
131
|
+
### One model, provider overrides
|
|
132
|
+
|
|
133
|
+
HTTP REST (`BaseHttpApiClient`) and WebSocket RPC (`GatewayRpcClient`) are the only two things that touch the network. Both stay **gateway-agnostic** in `core/`. `createGatewayApiClient(opts, { provider | env | providerModules })` returns the right implementation:
|
|
134
|
+
|
|
135
|
+
- Provider kind `gateway` is the core fallback. Hermes/OpenClaw are provider modules exported from `./providers/hermes` and `./providers/openclaw`.
|
|
136
|
+
- Resolution order: explicit `provider` → `CAVI_GATEWAY_PROVIDER` → `GATEWAY_PROVIDER` → default `gateway`.
|
|
137
|
+
- `Gateway*` names are canonical. `Hermes*` / `OpenClaw*` names are provider-specific exports for consumers that want an implementation directly.
|
|
138
|
+
|
|
139
|
+
Universal concepts (agent runs, run-stream events) live in `core`; product code re-exports them and adds only its own aggregates. Nothing duplicates a core type.
|
|
140
|
+
|
|
141
|
+
### Graceful degradation is a contract
|
|
142
|
+
|
|
143
|
+
`withFallback()` (in `core/gateway/envelope/index.ts`) wraps adapter loads. On transport/backend failure it returns a `DataEnvelope` with `source: "mock"` and a structured `contractGap` instead of throwing — so a flaky gateway degrades one panel rather than crashing the page. **401/403 and `unknown`-classified errors still throw.** New loaders route through `withFallback` / `withMutationResult` with a mock and an expected-contract summary.
|
|
144
|
+
|
|
145
|
+
### Paths are owned, never scattered
|
|
146
|
+
|
|
147
|
+
Every API route literal lives in a `*paths.ts` file. Global gateway/team/kanban routes live in `src/contracts/paths.ts`; CAVI extension routes live in `src/extensions/cavi/contracts/paths.ts`. Global surface keys live in `src/contracts/surfaces.ts`; CAVI extension surface keys live in `src/extensions/cavi/contracts/surfaces.ts`. A hardening test fails the build if a route string leaks anywhere else.
|
|
148
|
+
|
|
149
|
+
### Layered architecture
|
|
150
|
+
|
|
151
|
+
Strict, one-directional dependency flow — lower layers never import upward:
|
|
152
|
+
|
|
153
|
+
```text
|
|
154
|
+
core → contracts
|
|
155
|
+
core/contracts → extensions/cavi
|
|
156
|
+
core/contracts → providers/hermes | providers/openclaw | react
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
- **`core/`** — gateway-agnostic foundation (`http`, `data`, `env`, `runtime`, `sse`, `ws`, `gateway`). No product knowledge.
|
|
160
|
+
- **`contracts/`** — global path & surface contracts, the agnostic team manifest.
|
|
161
|
+
- **`extensions/cavi/`** — CAVI-specific clients, extension contracts, adapters, domain DTOs, registry wrappers.
|
|
162
|
+
- **`core/gateway/providers/`** — provider plugin interface, registry, normalization, and generic factories.
|
|
163
|
+
- **`providers/hermes` / `providers/openclaw`** — built-in provider implementations and modules.
|
|
164
|
+
- **`react/`** — context/hooks over the gateway client.
|
|
165
|
+
|
|
166
|
+
Gateway internals are organized by owner folder (`client/`, `agent/`, `run/`,
|
|
167
|
+
`rpc/`, `snapshots/`, `resources/`, `envelope/`, `portal/`). The published
|
|
168
|
+
`./core/gateway` subpath is backed by one canonical `src/core/gateway/index.ts`
|
|
169
|
+
that exports those owner folders. Package source and new contributions should
|
|
170
|
+
import from the owner folder directly or from the canonical aggregate.
|
|
171
|
+
|
|
172
|
+
The boundary rules are intentionally boring:
|
|
173
|
+
|
|
174
|
+
- `core/**` contains shared data, env, gateway, HTTP, runtime, SSE, and WebSocket behavior. It must not import from `extensions/cavi/**`, concrete `providers/**`, `react/**`, or app-specific modules.
|
|
175
|
+
- `contracts/**` contains global route, surface, and agnostic team-manifest contracts. It must not import from extensions or providers.
|
|
176
|
+
- `extensions/cavi/**` may import from core and contracts. It owns CAVI clients, extension contracts, adapters, domain DTOs, registry wrappers, and production fallback snapshots.
|
|
177
|
+
- `providers/hermes/**` and `providers/openclaw/**` may import from core and contracts. Provider-specific cookies, source paths, endpoint maps, and WebUI payload adapters stay there.
|
|
178
|
+
- `core/gateway/providers/**` owns provider module types, provider normalization, the registry, and generic factories. Built-in providers are ordinary modules passed through that boundary.
|
|
179
|
+
- `react/**` may import from `core/gateway/**` and React only. The root package does not re-export React hooks so non-React consumers do not pull React into their graph.
|
|
180
|
+
- Test fixtures live under `src/__tests__/fixtures/**`; production modules must not depend on them.
|
|
181
|
+
|
|
182
|
+
Shared implementation belongs in core before an extension uses it. CAVI may wrap core behavior for product fallbacks, but it should not duplicate HTTP clients, JSON request helpers, query builders, gateway errors, data guards, envelope contracts, runtime base-path helpers, RPC protocol code, SSE parsing, WebSocket target handling, run-event parsing, media interfaces, wiki interfaces, resolver composition, or static team registry defaults.
|
|
183
|
+
|
|
184
|
+
Extension code should stay product-shaped: Project Board in `extensions/cavi/project-board/**`, operator control in `extensions/cavi/operator-control/**`, portals in `extensions/cavi/portal/**`, library code in `extensions/cavi/library/**`, registry adapters in `extensions/cavi/registry/**`, and extension contracts in `extensions/cavi/contracts/**`.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Adding a gateway provider
|
|
189
|
+
|
|
190
|
+
This is the part the package is built for. A new gateway is a **module you register at the factory boundary** — you do not edit this package or fork it. The provider plugin surface lives at `@cavi-ai/api-client/core/gateway`.
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
import {
|
|
194
|
+
GatewayApiClient,
|
|
195
|
+
createGatewayApiClient,
|
|
196
|
+
createGatewayProviderRegistry,
|
|
197
|
+
} from "@cavi-ai/api-client";
|
|
198
|
+
import { type GatewayProviderModule } from "@cavi-ai/api-client/core/gateway";
|
|
199
|
+
|
|
200
|
+
const acmeProvider: GatewayProviderModule = {
|
|
201
|
+
kind: "acme",
|
|
202
|
+
aliases: ["acme-gateway"],
|
|
203
|
+
createApiClient: (options) => new GatewayApiClient(options, "acme-api"),
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
const registry = createGatewayProviderRegistry({
|
|
207
|
+
modules: [acmeProvider],
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const gateway = createGatewayApiClient(
|
|
211
|
+
{ baseUrl: "https://acme.example.com", auth },
|
|
212
|
+
{ provider: "acme-gateway", registry },
|
|
213
|
+
);
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Provider keys are normalized (trimmed, lowercased); `generic` is an alias for `gateway`. Duplicate keys throw by default; pass `{ allowOverrides: true }` only for an intentional override. Built-in providers are explicit modules, not hidden registry state.
|
|
217
|
+
|
|
218
|
+
A provider module may customize headers, endpoint maps, factories, or defaults. It should **not** fork the parser, the RPC protocol, retry semantics, or trace behavior — those are written once in `core`. The same module shape carries the media, wiki, agent-config, SSE, and WebSocket factories; implement only the `create*` factories your gateway actually needs, and missing factories fall back to the generic gateway implementation. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the full provider-author checklist.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Reference
|
|
223
|
+
|
|
224
|
+
### Environment configuration
|
|
225
|
+
|
|
226
|
+
`resolveHttpApiConfigFromEnv` gives consistent defaults and app-client aliases:
|
|
227
|
+
|
|
228
|
+
```ts
|
|
229
|
+
import {
|
|
230
|
+
CaviControlApiClient,
|
|
231
|
+
LibraryApiClient,
|
|
232
|
+
resolveHttpApiConfigFromEnv,
|
|
233
|
+
} from "@cavi-ai/api-client";
|
|
234
|
+
|
|
235
|
+
const config = resolveHttpApiConfigFromEnv(process.env);
|
|
236
|
+
|
|
237
|
+
const cavi = new CaviControlApiClient({
|
|
238
|
+
baseUrl: config.cavi.baseUrl,
|
|
239
|
+
auth: { bearerToken: config.cavi.authToken, clientId: config.cavi.clientId },
|
|
240
|
+
});
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Canonical environment keys:
|
|
244
|
+
|
|
245
|
+
- `CAVI_API_BASE_URL`, `CAVI_API_AUTH_TOKEN`, `CAVI_API_CLIENT_ID`
|
|
246
|
+
- `GATEWAY_API_BASE_URL`, `GATEWAY_API_AUTH_TOKEN`, `GATEWAY_API_CLIENT_ID`
|
|
247
|
+
- `LIBRARY_API_BASE_URL`, `LIBRARY_API_AUTH_TOKEN`, `LIBRARY_API_CLIENT_ID`
|
|
248
|
+
|
|
249
|
+
Alias keys for Expo and Vite clients are supported by default; pass `{ includeAliases: false }` to disable. Hermes-specific keys are available through `resolveHermesHttpApiConfigFromEnv` from the Hermes provider exports.
|
|
250
|
+
|
|
251
|
+
### Requests, headers, and errors
|
|
252
|
+
|
|
253
|
+
All HTTP clients share the same request behavior:
|
|
254
|
+
|
|
255
|
+
- `Accept: application/json` is always sent.
|
|
256
|
+
- `Authorization: Bearer <token>` is sent when `auth.bearerToken` is present.
|
|
257
|
+
- `X-Portal-Client-Id` defaults to `cavi-api-client` unless `auth.clientId` is provided.
|
|
258
|
+
- `Idempotency-Key` is sent when a request receives an `idempotencyKey`.
|
|
259
|
+
- Request bodies are JSON-encoded with `Content-Type: application/json`.
|
|
260
|
+
- Non-2xx responses throw `HttpApiError` with `path`, `url`, `method`, `status`, and the raw response `body`.
|
|
261
|
+
- Network failures, aborts, and invalid JSON are also surfaced as `HttpApiError`.
|
|
262
|
+
|
|
263
|
+
```ts
|
|
264
|
+
import { CAVI_CONTROL_API_ENDPOINTS, HttpApiError } from "@cavi-ai/api-client";
|
|
265
|
+
|
|
266
|
+
try {
|
|
267
|
+
await cavi.postJson(
|
|
268
|
+
CAVI_CONTROL_API_ENDPOINTS.operator.tasks,
|
|
269
|
+
{ title: "Review" },
|
|
270
|
+
"task-1",
|
|
271
|
+
);
|
|
272
|
+
} catch (error) {
|
|
273
|
+
if (error instanceof HttpApiError) {
|
|
274
|
+
console.error(error.status, error.path, error.body);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Pass `onTrace` to observe request timing without changing behavior:
|
|
280
|
+
|
|
281
|
+
```ts
|
|
282
|
+
const client = new CaviControlApiClient({
|
|
283
|
+
baseUrl: "https://control.example.com",
|
|
284
|
+
onTrace: (t) => console.debug(t.method, t.path, t.status, t.durationMs),
|
|
285
|
+
});
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Gateway providers
|
|
289
|
+
|
|
290
|
+
```ts
|
|
291
|
+
import {
|
|
292
|
+
createGatewayApiClient,
|
|
293
|
+
resolveGatewayProviderKind,
|
|
294
|
+
} from "@cavi-ai/api-client";
|
|
295
|
+
|
|
296
|
+
const provider = resolveGatewayProviderKind({
|
|
297
|
+
provider: settings.gatewayProvider,
|
|
298
|
+
env: process.env,
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
const gateway = createGatewayApiClient(config.gateway, { provider });
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Gateway slash commands are part of the `/v1/capabilities` contract (which may expose `commands`, `slashCommands`, or `slash_commands`). Normalize the catalog instead of hardcoding command lists:
|
|
305
|
+
|
|
306
|
+
```ts
|
|
307
|
+
import {
|
|
308
|
+
buildAgentSlashShortcuts,
|
|
309
|
+
extractGatewayCommandCatalog,
|
|
310
|
+
} from "@cavi-ai/api-client";
|
|
311
|
+
|
|
312
|
+
const capabilities = await gateway.getCapabilities();
|
|
313
|
+
const coreCommands = extractGatewayCommandCatalog(capabilities);
|
|
314
|
+
const shortcuts = buildAgentSlashShortcuts(activeAgent, { coreCommands });
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Gateway transports
|
|
318
|
+
|
|
319
|
+
HTTP, run-event SSE, and WebSocket/RPC share one shape: `core` owns the base transport and gateway contracts; providers add thin adapters for headers, endpoint maps, or default surfaces.
|
|
320
|
+
|
|
321
|
+
Core ownership is split by protocol: `core/http/**` owns base HTTP clients and errors, `core/gateway/client/**` owns gateway HTTP resources, `core/sse/**` owns generic SSE parsing, `core/gateway/run/**` owns run-event contracts and polling fallback, `core/gateway/rpc/**` owns JSON-RPC auth and request flow, `core/ws/**` owns generic WebSocket target/close handling, and `core/gateway/agent/**` owns provider-neutral agent config parsing. Provider modules add only required routing/session headers, endpoint maps, and payload adapters.
|
|
322
|
+
|
|
323
|
+
```ts
|
|
324
|
+
import {
|
|
325
|
+
createGatewaySseRunEventProvider,
|
|
326
|
+
createGatewayWebSocketClient,
|
|
327
|
+
} from "@cavi-ai/api-client";
|
|
328
|
+
|
|
329
|
+
const sse = createGatewaySseRunEventProvider(
|
|
330
|
+
{
|
|
331
|
+
httpBase: config.gateway.baseUrl,
|
|
332
|
+
authToken: config.gateway.authToken,
|
|
333
|
+
clientId: config.gateway.clientId,
|
|
334
|
+
sessionKey: session.id, // required by the Hermes adapter
|
|
335
|
+
},
|
|
336
|
+
{ provider },
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
const ws = createGatewayWebSocketClient(
|
|
340
|
+
target.wsUrl,
|
|
341
|
+
config.gateway.authToken,
|
|
342
|
+
{ clientId: config.gateway.clientId },
|
|
343
|
+
{ provider },
|
|
344
|
+
);
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Gateway media
|
|
348
|
+
|
|
349
|
+
```ts
|
|
350
|
+
import { createGatewayApiClient, createGatewayMediaClient } from "@cavi-ai/api-client";
|
|
351
|
+
|
|
352
|
+
const gateway = createGatewayApiClient(
|
|
353
|
+
{ baseUrl: config.gateway.baseUrl, auth },
|
|
354
|
+
{ provider },
|
|
355
|
+
);
|
|
356
|
+
const media = createGatewayMediaClient(
|
|
357
|
+
{ baseUrl: config.gateway.baseUrl, auth },
|
|
358
|
+
{ provider },
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
const providers = await media.listMediaProviders("audio");
|
|
362
|
+
const music = await media.generateMusic({
|
|
363
|
+
input: "lofi loop for a research dashboard",
|
|
364
|
+
format: "mp3",
|
|
365
|
+
options: { bpm: 90 },
|
|
366
|
+
});
|
|
367
|
+
const image = await media.generateImage({
|
|
368
|
+
input: "cover art for a research dashboard",
|
|
369
|
+
format: "png",
|
|
370
|
+
});
|
|
371
|
+
const voice = await media.generateTextToSpeech({
|
|
372
|
+
text: "The dashboard summary is ready.",
|
|
373
|
+
voiceId: "host-voice",
|
|
374
|
+
format: "mp3",
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
const finished = await media.waitForMediaJob("music", music.jobId ?? music.id!);
|
|
378
|
+
const assets = await media.listMediaAssets({ kind: "image" });
|
|
379
|
+
const imageBytes = await media.getImageAsset(assets.assets[0]!.id!);
|
|
380
|
+
const imageMetadata = await media.getMediaAssetMetadata(assets.assets[0]!.id!);
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Implemented by the generic gateway client plus `HermesMediaApiClient` and `OpenClawMediaApiClient`; routing stays behind `createGatewayMediaClient`. For provider-aware UI, normalize `/v1/capabilities` and optional media provider inventories:
|
|
384
|
+
|
|
385
|
+
```ts
|
|
386
|
+
import {
|
|
387
|
+
gatewaySupportsMediaKind,
|
|
388
|
+
gatewaySupportsTextToSpeech,
|
|
389
|
+
normalizeGatewayFeatureCapabilities,
|
|
390
|
+
} from "@cavi-ai/api-client";
|
|
391
|
+
|
|
392
|
+
const features = normalizeGatewayFeatureCapabilities({
|
|
393
|
+
capabilities: await gateway.getCapabilities(),
|
|
394
|
+
mediaProviders: await media.listMediaProviders(),
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
if (gatewaySupportsMediaKind(features, "image")) {
|
|
398
|
+
// show image controls
|
|
399
|
+
}
|
|
400
|
+
if (gatewaySupportsTextToSpeech(features)) {
|
|
401
|
+
// show voice controls
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Gateway wiki
|
|
406
|
+
|
|
407
|
+
```ts
|
|
408
|
+
import { createGatewayWikiClient } from "@cavi-ai/api-client";
|
|
409
|
+
|
|
410
|
+
const wiki = createGatewayWikiClient(
|
|
411
|
+
{ baseUrl: config.gateway.baseUrl, auth },
|
|
412
|
+
{ provider },
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
const vaults = await wiki.listWikiVaults();
|
|
416
|
+
const tree = await wiki.getWikiTree("research");
|
|
417
|
+
const page = await wiki.readWikiPage("research", "index.qmd");
|
|
418
|
+
|
|
419
|
+
await wiki.ingestWiki("research", {
|
|
420
|
+
path: "drafts/market-note.qmd",
|
|
421
|
+
content: "# Market note",
|
|
422
|
+
format: "qmd",
|
|
423
|
+
});
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
Use `GatewayWikiApiClient` or `createGatewayWikiClient` for wiki work so vault routing stays behind the gateway contract.
|
|
427
|
+
|
|
428
|
+
### Gateway RPC and React
|
|
429
|
+
|
|
430
|
+
```tsx
|
|
431
|
+
import {
|
|
432
|
+
GatewayClientProvider,
|
|
433
|
+
useGatewayClientContext,
|
|
434
|
+
} from "@cavi-ai/api-client/react";
|
|
435
|
+
|
|
436
|
+
export function AppShell() {
|
|
437
|
+
return (
|
|
438
|
+
<GatewayClientProvider
|
|
439
|
+
gatewayBaseUrl="https://gateway.example.com"
|
|
440
|
+
authToken={token}
|
|
441
|
+
clientId="portal-client"
|
|
442
|
+
requestedScopes={["operator.read"]}
|
|
443
|
+
autoReconnect
|
|
444
|
+
>
|
|
445
|
+
<OperatorPanel />
|
|
446
|
+
</GatewayClientProvider>
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
function OperatorPanel() {
|
|
451
|
+
const { client, state, connect } = useGatewayClientContext();
|
|
452
|
+
|
|
453
|
+
async function refresh() {
|
|
454
|
+
await connect();
|
|
455
|
+
const payload = await client?.request("sessions.list", { limit: 20 });
|
|
456
|
+
console.log(payload, state);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
return <button onClick={refresh}>Refresh</button>;
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
Also exported: `useGatewayClient`, `useGatewayRpc`, `useGatewayEvents`, `useGatewayConnectionState`, `useGatewayEventStream`. React must be available in the application runtime.
|
|
464
|
+
Use `gatewayClientOverrides` on the React hooks/provider for lower-level RPC knobs such as protocol range, default scopes, pre-auth env keys, request timeout, and concurrency.
|
|
465
|
+
|
|
466
|
+
### UI data adapters
|
|
467
|
+
|
|
468
|
+
`createCaviControlAdapters` builds dashboard loaders that combine gateway WebSocket RPC with HTTP fallbacks:
|
|
469
|
+
|
|
470
|
+
```ts
|
|
471
|
+
import { createCaviControlAdapters } from "@cavi-ai/api-client";
|
|
472
|
+
|
|
473
|
+
const adapters = createCaviControlAdapters({
|
|
474
|
+
gatewayBaseUrl: "https://gateway.example.com",
|
|
475
|
+
apiBaseUrl: "https://control.example.com",
|
|
476
|
+
authToken: token,
|
|
477
|
+
client: gatewayRpcClient,
|
|
478
|
+
fallbackMode: "empty",
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
const overview = await adapters.loadOverview();
|
|
482
|
+
const operator = await adapters.loadOperatorControl();
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
Pass `client: null` when only HTTP loaders are available. `fallbackMode` defaults to `"empty"` so public consumers get neutral fallback data. Use `"demo"` for generic demo snapshots, `createCaviControlAdapterFallbackProvider()` for CAVI-specific overrides, custom `snapshotFallbacks` / `caviFallbacks` for your app, or `"none"` to let snapshot failures propagate.
|
|
486
|
+
|
|
487
|
+
CAVI adapters are composition layers over core gateway contracts. Gateway WebSocket-backed control surfaces use the shared session loader and snapshot assembly helpers, then inject CAVI-specific fallbacks for operator control, Project Board, Discourse, cost history, and library loading.
|
|
488
|
+
|
|
489
|
+
### Team registry and manifest
|
|
490
|
+
|
|
491
|
+
Team and portal registry data is **runtime configuration** — the package ships the interface and normalizers, but `TEAM_REGISTRY_CONFIG` starts empty. Apps populate it after loading their gateway/plugin config; registry-dependent APIs fail loudly when config is missing.
|
|
492
|
+
|
|
493
|
+
```ts
|
|
494
|
+
import {
|
|
495
|
+
configureTeamRegistryConfig,
|
|
496
|
+
createOpenClawTeamRegistry,
|
|
497
|
+
type TeamRegistryConfig,
|
|
498
|
+
} from "@cavi-ai/api-client";
|
|
499
|
+
|
|
500
|
+
const registryConfig: TeamRegistryConfig = await loadRegistryConfigOnAppStart();
|
|
501
|
+
configureTeamRegistryConfig(registryConfig);
|
|
502
|
+
|
|
503
|
+
const registry = createOpenClawTeamRegistry(registryConfig);
|
|
504
|
+
const team = registry.getPortalTeam("research");
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
For dynamic frontends, prefer the **team manifest** — you own team/member entries; the package owns the contract, normalization, generated route grammar, workspace-path whitelisting, and action override resolution:
|
|
508
|
+
|
|
509
|
+
```ts
|
|
510
|
+
import {
|
|
511
|
+
configureTeamRegistryConfig,
|
|
512
|
+
normalizeTeamManifest,
|
|
513
|
+
resolvePath,
|
|
514
|
+
resolveTeamWorkspaceApiPath,
|
|
515
|
+
findTeamManifestTeam,
|
|
516
|
+
type TeamManifest,
|
|
517
|
+
} from "@cavi-ai/api-client";
|
|
518
|
+
|
|
519
|
+
const manifest = normalizeTeamManifest({
|
|
520
|
+
version: 1,
|
|
521
|
+
teams: [
|
|
522
|
+
{
|
|
523
|
+
id: "research",
|
|
524
|
+
identity: { displayName: "Research", slug: "research", code: "RND" },
|
|
525
|
+
workspace: {
|
|
526
|
+
rootPath: "/teams/research/workspace-research",
|
|
527
|
+
paths: ["research/complete", { key: "media.images", path: "media/images" }],
|
|
528
|
+
},
|
|
529
|
+
actions: [
|
|
530
|
+
{
|
|
531
|
+
id: "summarize",
|
|
532
|
+
input: { mode: "json", params: [{ key: "documentId", type: "string", required: true }] },
|
|
533
|
+
output: { mode: "json", contentType: "application/json" },
|
|
534
|
+
},
|
|
535
|
+
],
|
|
536
|
+
members: [{ id: "scout", capabilities: ["research.complete"] }],
|
|
537
|
+
},
|
|
538
|
+
],
|
|
539
|
+
} satisfies TeamManifest);
|
|
540
|
+
|
|
541
|
+
configureTeamRegistryConfig({ provider: "gateway", manifest });
|
|
542
|
+
|
|
543
|
+
resolvePath("team.kanban", "canonical", { teamId: "research" });
|
|
544
|
+
// /api/teams/research/kanban
|
|
545
|
+
|
|
546
|
+
const team = findTeamManifestTeam(manifest, "research");
|
|
547
|
+
resolveTeamWorkspaceApiPath(team!, "media.images", { memberId: "scout" });
|
|
548
|
+
// /api/teams/research/agents/scout/workspace/media/images
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
The workspace resolver accepts only paths declared in `workspace.paths`, so custom folders need no new endpoint constants. Team/member/action IDs are validated as single path segments, workspace entries reject traversal, and ambiguous registry lookup keys fail during registry creation. Gateway route bindings are declarative manifest entries resolved through `resolveGatewayRouteBinding`. New team-shaped CAVI paths should use the `team.*` contracts first; Project Board, Martina, Machine, Front Door, and portal-memory routes stay in the CAVI extension. See [`docs/team-manifest.md`](docs/team-manifest.md), [`docs/team-manifest.consumer.template.ts`](docs/team-manifest.consumer.template.ts), and [`docs/cavi-team-manifest.example.ts`](docs/cavi-team-manifest.example.ts) for the CAVI plugin-owned example.
|
|
552
|
+
|
|
553
|
+
### Path contracts
|
|
554
|
+
|
|
555
|
+
Route literals belong in path-owner files (`src/contracts/paths.ts`, `src/extensions/cavi/contracts/paths.ts`) and surface-owner files (`src/contracts/surfaces.ts`, `src/extensions/cavi/contracts/surfaces.ts`). Core contracts own global gateway/team routes only; extension routes stay in the extension. Extensions append their surface map over the core resolver with `createSurfacePathResolver`, so `resolvePath` remains core-only and `resolveCaviPath` can resolve both core and CAVI extension keys. Use exported constants, resolvers, or helpers — never recreate route strings.
|
|
556
|
+
|
|
557
|
+
```ts
|
|
558
|
+
import {
|
|
559
|
+
CAVI_CONTROL_API_ENDPOINTS,
|
|
560
|
+
GATEWAY_API_ENDPOINTS,
|
|
561
|
+
appendCaviApiPath,
|
|
562
|
+
resolveCaviPath,
|
|
563
|
+
resolvePath,
|
|
564
|
+
} from "@cavi-ai/api-client";
|
|
565
|
+
|
|
566
|
+
const taskPath = CAVI_CONTROL_API_ENDPOINTS.operator.task("task/a b");
|
|
567
|
+
const runPath = GATEWAY_API_ENDPOINTS.run("run/1");
|
|
568
|
+
const healthPath = resolvePath("gateway.health", "canonical");
|
|
569
|
+
const dashboardPath = resolveCaviPath("portal.dashboard", "canonical", { portal: "research" });
|
|
570
|
+
const portalAssetPath = appendCaviApiPath("/api/plugins/portal/research", "assets/logo.png");
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
Dynamic extension paths append validated relative suffixes to extension-owned base paths. Use `appendHttpQuery` for query strings instead of passing queries through path append helpers.
|
|
574
|
+
|
|
575
|
+
Canonical surface routes are API-first (`/api/plugins/<surface>/...`). Consumers should use exported constants, `resolvePath`, `resolveCaviPath`, and path helpers instead of assembling route strings.
|
|
576
|
+
|
|
577
|
+
### Repo root resolution
|
|
578
|
+
|
|
579
|
+
Filesystem integrations never assume a checkout layout — pass an explicit `repoRoot` or resolve `REPO_ROOT`:
|
|
580
|
+
|
|
581
|
+
```ts
|
|
582
|
+
import { requireRepoRoot } from "@cavi-ai/api-client";
|
|
583
|
+
|
|
584
|
+
const repoRoot = requireRepoRoot({ repoRoot: options.repoRoot, env: process.env });
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
Resolution order: explicit `repoRoot` → `env.REPO_ROOT` → explicit `globalRepoRoot` → `globalThis.__CAVI_REPO_ROOT__` → `process.env.REPO_ROOT`.
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
## Development
|
|
592
|
+
|
|
593
|
+
```sh
|
|
594
|
+
pnpm install # install dev dependencies and wire Husky hooks
|
|
595
|
+
pnpm test # vitest run — guardrails + behavior (the only test command)
|
|
596
|
+
pnpm run coverage # vitest run --coverage — coverage report
|
|
597
|
+
pnpm run build # tsc → dist/ (run before publishing or linking)
|
|
598
|
+
pnpm pack --dry-run # validates the published tarball; prepack runs the build
|
|
599
|
+
pnpm run verify # tests + build + markdown lint + pack dry-run
|
|
600
|
+
pnpm run clean # rm -rf dist
|
|
601
|
+
pnpm exec tsc --noEmit # typecheck only (strict mode is the lint gate)
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
There is no separate linter — `tsc` under `strict` is the type gate. ESM throughout: relative imports use the `.js` extension on `.ts` sources (`moduleResolution: "Bundler"`). Husky runs `pnpm test` on commit and `pnpm run verify` before push.
|
|
605
|
+
|
|
606
|
+
The **hardening tests** in [`src/__tests__/package-hardening.test.ts`](src/__tests__/package-hardening.test.ts) are the enforced package-boundary contract — they fail the build on forbidden imports, stray route literals, layout drift, baked-in registry data, and package-output drift. Treat them as the source of truth over prose, and update them only when the boundary intentionally changes.
|
|
607
|
+
|
|
608
|
+
## Contributing
|
|
609
|
+
|
|
610
|
+
Contributions — especially new gateway providers and features — are welcome. Start with [`CONTRIBUTING.md`](CONTRIBUTING.md) for the dev workflow, the provider-author checklist, and the boundary rules. Architecture and dependency direction are documented above in this README.
|
|
611
|
+
|
|
612
|
+
## Security
|
|
613
|
+
|
|
614
|
+
To report a vulnerability, see [`SECURITY.md`](SECURITY.md). Please do not open public issues for security reports.
|
|
615
|
+
|
|
616
|
+
## License
|
|
617
|
+
|
|
618
|
+
[MIT](LICENSE) © sasan1200
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported versions
|
|
4
|
+
|
|
5
|
+
`@cavi-ai/api-client` follows semantic versioning. While the package is pre-1.0,
|
|
6
|
+
security fixes are released against the latest published `0.x` line.
|
|
7
|
+
|
|
8
|
+
| Version | Supported |
|
|
9
|
+
| ------- | ------------------ |
|
|
10
|
+
| 0.1.x | :white_check_mark: |
|
|
11
|
+
| < 0.1 | :x: |
|
|
12
|
+
|
|
13
|
+
## Reporting a vulnerability
|
|
14
|
+
|
|
15
|
+
**Please do not open a public GitHub issue for security vulnerabilities.**
|
|
16
|
+
|
|
17
|
+
Report privately through one of:
|
|
18
|
+
|
|
19
|
+
- GitHub's [private vulnerability reporting](https://github.com/sasan1200/cavi-api-client/security/advisories/new)
|
|
20
|
+
(preferred), or
|
|
21
|
+
- email to <sasan.sotoodehfar@gmail.com> with `SECURITY` in the subject.
|
|
22
|
+
|
|
23
|
+
Please include:
|
|
24
|
+
|
|
25
|
+
- a description of the issue and its impact,
|
|
26
|
+
- steps to reproduce (a minimal example or PoC if possible),
|
|
27
|
+
- affected version(s),
|
|
28
|
+
- any suggested remediation.
|
|
29
|
+
|
|
30
|
+
You can expect an initial acknowledgement within a few business days. Once the
|
|
31
|
+
issue is confirmed and a fix is prepared, a patched release will be published and
|
|
32
|
+
the reporter credited (unless anonymity is requested).
|
|
33
|
+
|
|
34
|
+
## Scope notes
|
|
35
|
+
|
|
36
|
+
This package is a client library with **no runtime dependencies**. A few areas are
|
|
37
|
+
particularly relevant to security reports:
|
|
38
|
+
|
|
39
|
+
- **Credential handling.** Bearer tokens and client IDs are passed through to
|
|
40
|
+
request headers. Trace output is redacted (`redactSensitiveValue`,
|
|
41
|
+
`redactPreviewText`); report any path where a token, secret, or sensitive value
|
|
42
|
+
could leak into logs, traces, or errors.
|
|
43
|
+
- **Transport.** The HTTP client and WebSocket RPC client are the only
|
|
44
|
+
network-touching code. Report TLS/origin/auth-handshake concerns here.
|
|
45
|
+
- **Untrusted gateway responses.** The client parses gateway/HTTP payloads; report
|
|
46
|
+
parsing paths that could be abused by a malicious or compromised gateway.
|
|
47
|
+
|
|
48
|
+
Thank you for helping keep the project and its users safe.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
|