chore(version): up version to 2.2.0 CRM

This commit is contained in:
Sagnik
2026-04-18 21:48:14 +05:30
parent 954618c3ef
commit 274e17bf35
17 changed files with 17705 additions and 281 deletions

4
app/dist/index.html vendored
View File

@@ -4,8 +4,8 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Velocity WebOS</title>
<script type="module" crossorigin src="./assets/index-BYTPd1oW.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-UA0RXBVG.css">
<script type="module" crossorigin src="./assets/index-DbaoiOvw.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-BDvIhi37.css">
</head>
<body>
<div id="root"></div>

12
app/node_modules/.package-lock.json generated vendored
View File

@@ -2162,9 +2162,9 @@
}
},
"node_modules/@mediapipe/tasks-vision": {
"version": "0.10.17",
"resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz",
"integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==",
"version": "0.10.34",
"resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.34.tgz",
"integrity": "sha512-KFGyhDsjJ+9WUMcMfjTOpcEp3LJNS3KwC7BfvKrCYELn/7G/5kmwnU7z6Spps+iWQoTGL8xW8i68r65OTa3DwA==",
"license": "Apache-2.0"
},
"node_modules/@monogrid/gainmap-js": {
@@ -3882,6 +3882,12 @@
}
}
},
"node_modules/@react-three/drei/node_modules/@mediapipe/tasks-vision": {
"version": "0.10.17",
"resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz",
"integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==",
"license": "Apache-2.0"
},
"node_modules/@react-three/fiber": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.5.0.tgz",

View File

@@ -1 +1 @@
{"root":["../../src/app.tsx","../../src/global.d.ts","../../src/main.tsx","../../src/app/oracle/page.tsx","../../src/components/layout/loginscreen.tsx","../../src/components/layout/notificationcenter.tsx","../../src/components/layout/sidebar.tsx","../../src/components/modules/catalyst.tsx","../../src/components/modules/catalystmarketingtab.tsx","../../src/components/modules/dashboard.tsx","../../src/components/modules/groundtruthpicker.tsx","../../src/components/modules/inventory.tsx","../../src/components/modules/oracle.tsx","../../src/components/modules/sentinel.tsx","../../src/components/modules/settings.tsx","../../src/components/modules/sentinel/perceptionplayer.tsx","../../src/components/modules/sentinel/sentinellivesession.tsx","../../src/components/oracle/leadinspector.tsx","../../src/components/oracle/pipelineview.tsx","../../src/components/oracle/mockleads.ts","../../src/components/sentinel/journeyriver/inspectorpanel.tsx","../../src/components/sentinel/journeyriver/riverpath.tsx","../../src/components/sentinel/journeyriver/index.tsx","../../src/components/ui/accordion.tsx","../../src/components/ui/alert-dialog.tsx","../../src/components/ui/alert.tsx","../../src/components/ui/aspect-ratio.tsx","../../src/components/ui/avatar.tsx","../../src/components/ui/badge.tsx","../../src/components/ui/breadcrumb.tsx","../../src/components/ui/button-group.tsx","../../src/components/ui/button.tsx","../../src/components/ui/calendar.tsx","../../src/components/ui/card.tsx","../../src/components/ui/carousel.tsx","../../src/components/ui/chart.tsx","../../src/components/ui/checkbox.tsx","../../src/components/ui/collapsible.tsx","../../src/components/ui/command.tsx","../../src/components/ui/context-menu.tsx","../../src/components/ui/dialog.tsx","../../src/components/ui/drawer.tsx","../../src/components/ui/dropdown-menu.tsx","../../src/components/ui/empty.tsx","../../src/components/ui/field.tsx","../../src/components/ui/form.tsx","../../src/components/ui/hover-card.tsx","../../src/components/ui/input-group.tsx","../../src/components/ui/input-otp.tsx","../../src/components/ui/input.tsx","../../src/components/ui/item.tsx","../../src/components/ui/kbd.tsx","../../src/components/ui/label.tsx","../../src/components/ui/menubar.tsx","../../src/components/ui/navigation-menu.tsx","../../src/components/ui/pagination.tsx","../../src/components/ui/popover.tsx","../../src/components/ui/progress.tsx","../../src/components/ui/radio-group.tsx","../../src/components/ui/resizable.tsx","../../src/components/ui/scroll-area.tsx","../../src/components/ui/select.tsx","../../src/components/ui/separator.tsx","../../src/components/ui/sheet.tsx","../../src/components/ui/sidebar.tsx","../../src/components/ui/skeleton.tsx","../../src/components/ui/slider.tsx","../../src/components/ui/sonner.tsx","../../src/components/ui/spinner.tsx","../../src/components/ui/switch.tsx","../../src/components/ui/table.tsx","../../src/components/ui/tabs.tsx","../../src/components/ui/textarea.tsx","../../src/components/ui/toggle-group.tsx","../../src/components/ui/toggle.tsx","../../src/components/ui/tooltip.tsx","../../src/hooks/use-mobile.ts","../../src/hooks/usecrmbootstrap.ts","../../src/hooks/usemediapipefacelandmarker.ts","../../src/hooks/usevelocitysocket.ts","../../src/lib/api.ts","../../src/lib/crmmappers.ts","../../src/lib/oraclequeryclient.ts","../../src/lib/utils.ts","../../src/oracle/components/branchbar.tsx","../../src/oracle/components/canvasviewport.tsx","../../src/oracle/components/componentregistry.tsx","../../src/oracle/components/promptrail.tsx","../../src/oracle/components/rollbackconfirmmodal.tsx","../../src/oracle/components/sharemodal.tsx","../../src/oracle/components/renderers/activitystreamrenderer.tsx","../../src/oracle/components/renderers/barchartrenderer.tsx","../../src/oracle/components/renderers/errornoticerenderer.tsx","../../src/oracle/components/renderers/geomaprenderer.tsx","../../src/oracle/components/renderers/kpitilerenderer.tsx","../../src/oracle/components/renderers/linechartrenderer.tsx","../../src/oracle/components/renderers/pipelineboardrenderer.tsx","../../src/oracle/components/renderers/rendererwrapper.tsx","../../src/oracle/components/renderers/tablerenderer.tsx","../../src/oracle/components/renderers/timelinerenderer.tsx","../../src/oracle/components/review/mergereviewdrawer.tsx","../../src/oracle/hooks/useoracleexecution.ts","../../src/oracle/hooks/useoraclepage.ts","../../src/oracle/lib/oracleapiclient.ts","../../src/oracle/lib/oracledemodata.ts","../../src/oracle/types/canvas.ts","../../src/store/usecurrencystore.ts","../../src/store/usemarketingstore.ts","../../src/store/usestore.ts","../../src/types/crm.ts","../../src/types/index.ts","../../src/utils/curvegenerator.ts","../../src/utils/landmarkpacketencoder.ts"],"version":"5.9.3"}
{"root":["../../src/app.tsx","../../src/main.tsx","../../src/app/admin/page.tsx","../../src/app/oracle/page.tsx","../../src/components/layout/loginscreen.tsx","../../src/components/layout/notificationcenter.tsx","../../src/components/layout/sidebar.tsx","../../src/components/modules/crm.tsx","../../src/components/modules/catalyst.tsx","../../src/components/modules/catalystmarketingtab.tsx","../../src/components/modules/dashboard.tsx","../../src/components/modules/groundtruthpicker.tsx","../../src/components/modules/inventory.tsx","../../src/components/modules/oracle.tsx","../../src/components/modules/sentinel.tsx","../../src/components/modules/settings.tsx","../../src/components/modules/sentinel/perceptionplayer.tsx","../../src/components/modules/sentinel/sentinellivesession.tsx","../../src/components/oracle/leadinspector.tsx","../../src/components/oracle/pipelineview.tsx","../../src/components/sentinel/journeyriver/inspectorpanel.tsx","../../src/components/sentinel/journeyriver/riverpath.tsx","../../src/components/sentinel/journeyriver/index.tsx","../../src/components/ui/accordion.tsx","../../src/components/ui/alert-dialog.tsx","../../src/components/ui/alert.tsx","../../src/components/ui/aspect-ratio.tsx","../../src/components/ui/avatar.tsx","../../src/components/ui/badge.tsx","../../src/components/ui/breadcrumb.tsx","../../src/components/ui/button-group.tsx","../../src/components/ui/button.tsx","../../src/components/ui/calendar.tsx","../../src/components/ui/card.tsx","../../src/components/ui/carousel.tsx","../../src/components/ui/chart.tsx","../../src/components/ui/checkbox.tsx","../../src/components/ui/collapsible.tsx","../../src/components/ui/command.tsx","../../src/components/ui/context-menu.tsx","../../src/components/ui/dialog.tsx","../../src/components/ui/drawer.tsx","../../src/components/ui/dropdown-menu.tsx","../../src/components/ui/empty.tsx","../../src/components/ui/field.tsx","../../src/components/ui/form.tsx","../../src/components/ui/hover-card.tsx","../../src/components/ui/input-group.tsx","../../src/components/ui/input-otp.tsx","../../src/components/ui/input.tsx","../../src/components/ui/item.tsx","../../src/components/ui/kbd.tsx","../../src/components/ui/label.tsx","../../src/components/ui/menubar.tsx","../../src/components/ui/navigation-menu.tsx","../../src/components/ui/pagination.tsx","../../src/components/ui/popover.tsx","../../src/components/ui/progress.tsx","../../src/components/ui/radio-group.tsx","../../src/components/ui/resizable.tsx","../../src/components/ui/scroll-area.tsx","../../src/components/ui/select.tsx","../../src/components/ui/separator.tsx","../../src/components/ui/sheet.tsx","../../src/components/ui/sidebar.tsx","../../src/components/ui/skeleton.tsx","../../src/components/ui/slider.tsx","../../src/components/ui/sonner.tsx","../../src/components/ui/spinner.tsx","../../src/components/ui/switch.tsx","../../src/components/ui/table.tsx","../../src/components/ui/tabs.tsx","../../src/components/ui/textarea.tsx","../../src/components/ui/toggle-group.tsx","../../src/components/ui/toggle.tsx","../../src/components/ui/tooltip.tsx","../../src/hooks/use-mobile.ts","../../src/hooks/usecrmbootstrap.ts","../../src/hooks/usemediapipefacelandmarker.ts","../../src/hooks/usevelocitysocket.ts","../../src/lib/api.ts","../../src/lib/crmapi.ts","../../src/lib/crmmappers.ts","../../src/lib/platformmappers.ts","../../src/lib/utils.ts","../../src/lib/velocityplatformclient.ts","../../src/oracle/components/branchbar.tsx","../../src/oracle/components/canvasviewport.tsx","../../src/oracle/components/componentregistry.tsx","../../src/oracle/components/promptrail.tsx","../../src/oracle/components/rollbackconfirmmodal.tsx","../../src/oracle/components/sharemodal.tsx","../../src/oracle/components/renderers/activitystreamrenderer.tsx","../../src/oracle/components/renderers/barchartrenderer.tsx","../../src/oracle/components/renderers/errornoticerenderer.tsx","../../src/oracle/components/renderers/geomaprenderer.tsx","../../src/oracle/components/renderers/kpitilerenderer.tsx","../../src/oracle/components/renderers/linechartrenderer.tsx","../../src/oracle/components/renderers/pipelineboardrenderer.tsx","../../src/oracle/components/renderers/rendererwrapper.tsx","../../src/oracle/components/renderers/tablerenderer.tsx","../../src/oracle/components/renderers/timelinerenderer.tsx","../../src/oracle/components/review/mergereviewdrawer.tsx","../../src/oracle/hooks/useoracleexecution.ts","../../src/oracle/hooks/useoraclepage.ts","../../src/oracle/lib/oracleapiclient.ts","../../src/oracle/types/canvas.ts","../../src/store/usecurrencystore.ts","../../src/store/usemarketingstore.ts","../../src/store/usestore.ts","../../src/types/crm.ts","../../src/types/crmtypes.ts","../../src/types/index.ts","../../src/utils/curvegenerator.ts","../../src/utils/landmarkpacketencoder.ts"],"version":"5.9.3"}

View File

@@ -39,21 +39,6 @@ const landmarks = faceLandmarker.detect(image);
For more information, refer to the [Face Landmarker](https://developers.google.com/mediapipe/solutions/vision/face_landmarker/web_js) documentation.
## Face Stylizer
The MediaPipe Face Stylizer lets you perform face stylization on images.
```
const vision = await FilesetResolver.forVisionTasks(
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/wasm"
);
const faceStylizer = await FaceStylizer.createFromModelPath(vision,
"https://storage.googleapis.com/mediapipe-models/face_stylizer/blaze_face_stylizer/float32/1/blaze_face_stylizer.task"
);
const image = document.getElementById("image") as HTMLImageElement;
const stylizedImage = faceStylizer.stylize(image);
```
## Gesture Recognizer
The MediaPipe Gesture Recognizer task lets you recognize hand gestures in real

View File

@@ -1,15 +1,23 @@
{
"name": "@mediapipe/tasks-vision",
"version": "0.10.17",
"version": "0.10.34",
"description": "MediaPipe Vision Tasks",
"main": "vision_bundle.cjs",
"browser": "vision_bundle.mjs",
"module": "vision_bundle.mjs",
"exports": {
"import": "./vision_bundle.mjs",
"require": "./vision_bundle.cjs",
"default": "./vision_bundle.mjs",
"types": "./vision.d.ts"
".": {
"import": "./vision_bundle.mjs",
"require": "./vision_bundle.cjs",
"default": "./vision_bundle.mjs",
"types": "./vision.d.ts"
},
"./vision_wasm_internal.js": "./wasm/vision_wasm_internal.js",
"./vision_wasm_internal.wasm": "./wasm/vision_wasm_internal.wasm",
"./vision_wasm_nosimd_internal.js": "./wasm/vision_wasm_nosimd_internal.js",
"./vision_wasm_nosimd_internal.wasm": "./wasm/vision_wasm_nosimd_internal.wasm",
"./vision_wasm_module_internal.js": "./wasm/vision_wasm_module_internal.js",
"./vision_wasm_module_internal.wasm": "./wasm/vision_wasm_module_internal.wasm"
},
"author": "mediapipe@google.com",
"license": "Apache-2.0",

View File

@@ -299,7 +299,7 @@ export declare class DrawingUtils {
*
* @export
* @param boundingBox The bounding box to draw.
* @param style The style to visualize the boundin box.
* @param style The style to visualize the bounding box.
*/
drawBoundingBox(boundingBox: BoundingBox, style?: DrawingOptions): void;
/**
@@ -699,133 +699,6 @@ export declare interface FaceLandmarkerResult {
facialTransformationMatrixes: Matrix[];
}
/** Performs face stylization on images. */
export declare class FaceStylizer extends VisionTaskRunner {
/**
* Initializes the Wasm runtime and creates a new Face Stylizer from the
* provided options.
* @export
* @param wasmFileset A configuration object that provides the location of
* the Wasm binary and its loader.
* @param faceStylizerOptions The options for the Face Stylizer. Note
* that either a path to the model asset or a model buffer needs to be
* provided (via `baseOptions`).
*/
static createFromOptions(wasmFileset: WasmFileset, faceStylizerOptions: FaceStylizerOptions): Promise<FaceStylizer>;
/**
* Initializes the Wasm runtime and creates a new Face Stylizer based on
* the provided model asset buffer.
* @export
* @param wasmFileset A configuration object that provides the location of
* the Wasm binary and its loader.
* @param modelAssetBuffer An array or a stream containing a binary
* representation of the model.
*/
static createFromModelBuffer(wasmFileset: WasmFileset, modelAssetBuffer: Uint8Array | ReadableStreamDefaultReader): Promise<FaceStylizer>;
/**
* Initializes the Wasm runtime and creates a new Face Stylizer based on
* the path to the model asset.
* @export
* @param wasmFileset A configuration object that provides the location of
* the Wasm binary and its loader.
* @param modelAssetPath The path to the model asset.
*/
static createFromModelPath(wasmFileset: WasmFileset, modelAssetPath: string): Promise<FaceStylizer>;
private constructor();
/**
* Sets new options for the Face Stylizer.
*
* Calling `setOptions()` with a subset of options only affects those
* options. You can reset an option back to its default value by
* explicitly setting it to `undefined`.
*
* @export
* @param options The options for the Face Stylizer.
*/
setOptions(options: FaceStylizerOptions): Promise<void>;
/**
* Performs face stylization on the provided single image and invokes the
* callback with result. The method returns synchronously once the callback
* returns. Only use this method when the FaceStylizer is created with the
* image running mode.
*
* @param image An image to process.
* @param callback The callback that is invoked with the stylized image or
* `null` if no face was detected. The lifetime of the returned data is
* only guaranteed for the duration of the callback.
*/
stylize(image: ImageSource, callback: FaceStylizerCallback): void;
/**
* Performs face stylization on the provided single image and invokes the
* callback with result. The method returns synchronously once the callback
* returns. Only use this method when the FaceStylizer is created with the
* image running mode.
*
* The 'imageProcessingOptions' parameter can be used to specify one or all
* of:
* - the rotation to apply to the image before performing stylization, by
* setting its 'rotationDegrees' property.
* - the region-of-interest on which to perform stylization, by setting its
* 'regionOfInterest' property. If not specified, the full image is used.
* If both are specified, the crop around the region-of-interest is extracted
* first, then the specified rotation is applied to the crop.
*
* @param image An image to process.
* @param imageProcessingOptions the `ImageProcessingOptions` specifying how
* to process the input image before running inference.
* @param callback The callback that is invoked with the stylized image or
* `null` if no face was detected. The lifetime of the returned data is
* only guaranteed for the duration of the callback.
*/
stylize(image: ImageSource, imageProcessingOptions: ImageProcessingOptions, callback: FaceStylizerCallback): void;
/**
* Performs face stylization on the provided single image and returns the
* result. This method creates a copy of the resulting image and should not be
* used in high-throughput applications. Only use this method when the
* FaceStylizer is created with the image running mode.
*
* @param image An image to process.
* @return A stylized face or `null` if no face was detected. The result is
* copied to avoid lifetime issues.
*/
stylize(image: ImageSource): MPImage | null;
/**
* Performs face stylization on the provided single image and returns the
* result. This method creates a copy of the resulting image and should not be
* used in high-throughput applications. Only use this method when the
* FaceStylizer is created with the image running mode.
*
* The 'imageProcessingOptions' parameter can be used to specify one or all
* of:
* - the rotation to apply to the image before performing stylization, by
* setting its 'rotationDegrees' property.
* - the region-of-interest on which to perform stylization, by setting its
* 'regionOfInterest' property. If not specified, the full image is used.
* If both are specified, the crop around the region-of-interest is extracted
* first, then the specified rotation is applied to the crop.
*
* @param image An image to process.
* @param imageProcessingOptions the `ImageProcessingOptions` specifying how
* to process the input image before running inference.
* @return A stylized face or `null` if no face was detected. The result is
* copied to avoid lifetime issues.
*/
stylize(image: ImageSource, imageProcessingOptions: ImageProcessingOptions): MPImage | null;
}
/**
* A callback that receives an `MPImage` object from the face stylizer, or
* `null` if no face was detected. The lifetime of the underlying data is
* limited to the duration of the callback. If asynchronous processing is
* needed, all data needs to be copied before the callback returns (via
* `image.clone()`).
*/
export declare type FaceStylizerCallback = (image: MPImage | null) => void;
/** Options to configure the MediaPipe Face Stylizer Task */
export declare interface FaceStylizerOptions extends VisionTaskOptions {
}
/**
* Resolves the files required for the MediaPipe Task APIs.
*
@@ -841,12 +714,13 @@ export declare class FilesetResolver {
*
* If your environment requires custom locations for the MediaPipe Wasm files,
* you can use `isSimdSupported()` to decide whether to load the SIMD-based
* assets.
* assets. Note that for ES6 Modules, SIMD is assumed to be always supported.
*
* @param useModule Whether to use ES6 Modules for the Wasm files.
* @export
* @return Whether SIMD support was detected in the current environment.
*/
static isSimdSupported(): Promise<boolean>;
static isSimdSupported(useModule?: boolean): Promise<boolean>;
/**
* Creates a fileset for the MediaPipe Audio tasks.
*
@@ -854,10 +728,11 @@ export declare class FilesetResolver {
* @param basePath An optional base path to specify the directory the Wasm
* files should be loaded from. If not specified, the Wasm files are
* loaded from the host's root directory.
* @param useModule Whether to use ES6 Modules for the Wasm files.
* @return A `WasmFileset` that can be used to initialize MediaPipe Audio
* tasks.
*/
static forAudioTasks(basePath?: string): Promise<WasmFileset>;
static forAudioTasks(basePath?: string, useModule?: boolean): Promise<WasmFileset>;
/**
* Creates a fileset for the MediaPipe GenAI tasks.
*
@@ -865,21 +740,11 @@ export declare class FilesetResolver {
* @param basePath An optional base path to specify the directory the Wasm
* files should be loaded from. If not specified, the Wasm files are
* loaded from the host's root directory.
* @param useModule Whether to use ES6 Modules for the Wasm files.
* @return A `WasmFileset` that can be used to initialize MediaPipe GenAI
* tasks.
*/
static forGenAiTasks(basePath?: string): Promise<WasmFileset>;
/**
* Creates a fileset for the MediaPipe GenAI Experimental tasks.
*
* @export
* @param basePath An optional base path to specify the directory the Wasm
* files should be loaded from. If not specified, the Wasm files are
* loaded from the host's root directory.
* @return A `WasmFileset` that can be used to initialize MediaPipe GenAI
* tasks.
*/
static forGenAiExperimentalTasks(basePath?: string): Promise<WasmFileset>;
static forGenAiTasks(basePath?: string, useModule?: boolean): Promise<WasmFileset>;
/**
* Creates a fileset for the MediaPipe Text tasks.
*
@@ -887,10 +752,11 @@ export declare class FilesetResolver {
* @param basePath An optional base path to specify the directory the Wasm
* files should be loaded from. If not specified, the Wasm files are
* loaded from the host's root directory.
* @param useModule Whether to use ES6 Modules for the Wasm files.
* @return A `WasmFileset` that can be used to initialize MediaPipe Text
* tasks.
*/
static forTextTasks(basePath?: string): Promise<WasmFileset>;
static forTextTasks(basePath?: string, useModule?: boolean): Promise<WasmFileset>;
/**
* Creates a fileset for the MediaPipe Vision tasks.
*
@@ -898,10 +764,11 @@ export declare class FilesetResolver {
* @param basePath An optional base path to specify the directory the Wasm
* files should be loaded from. If not specified, the Wasm files are
* loaded from the host's root directory.
* @param useModule Whether to use ES6 Modules for the Wasm files.
* @return A `WasmFileset` that can be used to initialize MediaPipe Vision
* tasks.
*/
static forVisionTasks(basePath?: string): Promise<WasmFileset>;
static forVisionTasks(basePath?: string, useModule?: boolean): Promise<WasmFileset>;
}
/** Performs hand gesture recognition on images. */
@@ -2080,7 +1947,7 @@ export declare class InteractiveSegmenter extends VisionTaskRunner {
export declare type InteractiveSegmenterCallback = (result: InteractiveSegmenterResult) => void;
/** Options to configure the MediaPipe Interactive Segmenter Task */
export declare interface InteractiveSegmenterOptions extends TaskRunnerOptions {
export declare interface InteractiveSegmenterOptions extends VisionTaskOptions {
/** Whether to output confidence masks. Defaults to true. */
outputConfidenceMasks?: boolean | undefined;
/** Whether to output the category masks. Defaults to false. */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -618,7 +618,7 @@ function AboutSection() {
<h4 className="text-white font-semibold text-lg mb-1">Velocity WebOS</h4>
<p className="text-sm mb-4" style={{ color: 'hsl(var(--muted-fg))' }}>Real Estate Operating System</p>
<div className="flex items-center justify-center gap-2 text-xs mb-6" style={{ color: 'hsl(var(--subtle-fg))' }}>
<span>Version 2.1.0</span>
<span>Version 2.2.0 CRM</span>
<span></span>
<span>{token ? 'Authenticated session active' : 'No active session'}</span>
</div>

View File

@@ -189,7 +189,7 @@ export const useStore = create<StoreState>()(
isConnected: false,
serverStatus: 'syncing',
lastSync: new Date(),
version: '2.1.0',
version: '2.2.0 CRM',
},
updateStatus: (status) => set((state) => ({
status: { ...state.status, ...status },

View File

@@ -1,81 +0,0 @@
# Delivery Log
## Multi-Surface Platform and Oracle Expansion
### Completed in this pass
- Confirmed backend route families are registered in `backend/main.py`:
- `routes_mobile_edge.py`
- `routes_inventory.py`
- `routes_admin_surface.py`
- Confirmed Oracle extension artifacts already exist in the workspace:
- `backend/oracle/schema_extension_v2.sql`
- `backend/oracle/oracle_template_seed_db.json`
- Completed iPad residual navigation and feature views:
- Added `CommunicationsView.swift`
- Added `CalendarView.swift`
- Wired both into `ContentView.swift`
- Added Android tablet scaffold under `android-tablet/`
- Compose app shell
- Navigation graph
- Dashboard, Inventory, Oracle, Sentinel, and Settings feature stubs
- Added iPhone edge app scaffold under `iOS/velocity-edge-phone/`
- SwiftUI app entry
- Alerts, Lead Summary, Communications, Notes, Transcriptions, Settings
- Added Android phone edge scaffold under `android-edge-phone/`
- Compose app shell
- Alerts, Lead Summary, Communications, Notes, Transcriptions, Settings
- Added WebOS admin panel surface at `app/src/app/admin/page.tsx`
- Added `docs/KIMI_SYNTHETIC_DATA_DOWNSTREAM_PLAN.md`
- Hardened live auth/session behavior across WebOS:
- JWT roles are normalized to uppercase in `backend/auth/dependencies.py`
- WebOS session restore now re-validates the real backend token on reload in `app/src/App.tsx`
- Top-bar identity now renders the authenticated backend user instead of hard-coded operator text
- Removed misleading mock fallback behavior from active WebOS surfaces:
- `app/src/store/useStore.ts` now starts with empty/live-only state instead of fabricated leads, visitors, metrics, and units
- `app/src/hooks/useCrmBootstrap.ts` now hydrates CRM plus inventory state from backend data and clears state on failure instead of silently preserving fake data
- `app/src/lib/oracleQueryClient.ts` now throws when `VITE_ORACLE_QUERY_URL` is missing instead of generating mock Oracle answers
- Rebuilt the investor-facing WebOS dashboard around live backend data:
- `app/src/components/modules/Dashboard.tsx` now renders CRM lead counts, real conversation volume, inventory preview, velocity trends, sync state, and mobile-edge alerts
- Removed the previous fabricated AI chat, top performer, and static KPI content from the dashboard surface
- Extended the live inventory contract and frontend mapping:
- `backend/api/routes_inventory.py` now includes `price_bands` and `unit_mix` in property summary payloads
- `app/src/lib/velocityPlatformClient.ts` and `app/src/lib/platformMappers.ts` now map inventory properties into live Inventory module cards
- Reduced fabricated marketing behavior in Catalyst:
- `app/src/store/useMarketingStore.ts` now initializes empty instead of seeded mock campaigns/assets/insights/events
- `app/src/components/modules/Catalyst.tsx` no longer auto-generates fake optimization feed events
- `app/src/components/modules/CatalystMarketingTab.tsx` no longer exposes a synthetic lead seeding path from the production shell
- `app/src/components/modules/GroundTruthPicker.tsx` now requires real operator-provided assets instead of showing built-in sample media
- Oracle v1 client auth is now aligned with the main platform session:
- `app/src/oracle/lib/oracleApiClient.ts` will reuse the live Velocity token if a dedicated `oracle_jwt` is not present
- Completed final WebOS production pass:
- `app/src/app/admin/page.tsx` now stages real bounded admin actions through `POST /api/admin-surface/actions`
- `app/src/components/modules/Settings.tsx` now reflects truthful session/config state instead of fake device pairing and hard-coded profile data
- Removed inactive demo-only WebOS files such as `app/src/lib/oracleQueryClient.ts`, `app/src/oracle/lib/oracleDemoData.ts`, and `app/src/components/oracle/mockLeads.ts`
- Confirmed the iPad residual views are now live-backend readers rather than local static arrays:
- `iOS/velocity/velocity/Features/Communications/CommunicationsView.swift`
- `iOS/velocity/velocity/Features/Calendar/CalendarView.swift`
- `iOS/velocity/velocity/Core/Networking/VelocityAPIClient.swift`
- `iOS/velocity/velocity/Core/Config/AppConfig.swift`
### MVP limits still in place
- Android projects are scaffolds only; they are not yet wired to shared API clients, auth, or install registration.
- The iPhone edge scaffold is source-first and does not yet include a dedicated `.xcodeproj` target.
- The WebOS admin page is mounted into the live Vite shell and can now stage bounded actions against the backend audit trail; auto-execution remains intentionally out of scope.
- The iPad Communications and Calendar views read live backend data, but the broader iPad app still contains other legacy mock-backed modules outside this residual slice.
- The active WebOS runtime path has been hardened away from mock/demo behavior, but deeper non-WebOS workstream items remain out of scope for this pass, especially legacy iPad modules and simulator-only inventory/AR helpers on iOS.
- Oracle template seed metadata needs correction: `_meta.total_seed_examples` does not match the actual seed example count in `backend/oracle/oracle_template_seed_db.json`.
- Sprint-1 documentation artifacts called for in the delivery pack are still missing as committed repo outputs, including the residual audit artifact and contract/package documentation.
### Verification steps run
- Python syntax compilation for backend route files
- JSON validation for Oracle seed DB
- SQL parse sanity check on extension migration
- `npx tsc --noEmit` for the WebOS app after live-auth and no-mock hardening changes
- `python3 -m py_compile` for backend auth and route modules after role/session hardening
### Recommended next implementation step
WebOS is now the strongest completed surface. The next implementation step should move fully to iOS and Android completion while preserving the live backend/auth patterns established here.