mirror of
https://github.com/hanzoai/insights.git
synced 2026-11-03 00:52:32 +00:00
Mechanically re-derived: bin/debrand runs over a fresh import of posthog/posthog@fa1a9a60d4 (2026-08-06). The pipeline (.hanzo/workflows), the Dockerfiles and bin/docker* entrypoints, compose files, LLM.md and the squashed initial migration are restored from the shipped tree, same as the previous import. The prune's import-closure guard kept 21 products the new core now imports; dropping them is a refactor now, recorded rather than forced.
118 lines
5.7 KiB
TypeScript
118 lines
5.7 KiB
TypeScript
import { FEATURE_FLAGS } from 'lib/constants'
|
|
import { urls } from 'scenes/urls'
|
|
|
|
import { FileSystemIconType, ProductItemCategory, ProductKey } from '~/queries/schema/schema-general'
|
|
|
|
import { FileSystemIconColor, ProductManifest } from '../../frontend/src/types'
|
|
|
|
export const manifest: ProductManifest = {
|
|
name: 'ReplayVision',
|
|
scenes: {
|
|
ReplayVision: {
|
|
name: 'Replay vision',
|
|
import: () => import('./frontend/replay_scanners/ReplayScannersScene'),
|
|
projectBased: true,
|
|
description:
|
|
'Set up AI scanners that automatically analyze new session recordings as they come in. Each result emits a queryable event.',
|
|
iconType: 'replay_vision',
|
|
layout: 'app-container',
|
|
},
|
|
ReplayVisionScanner: {
|
|
name: 'Replay vision scanner',
|
|
import: () => import('./frontend/replay_scanners/ReplayScanner'),
|
|
projectBased: true,
|
|
iconType: 'replay_vision',
|
|
layout: 'app-container',
|
|
},
|
|
ReplayVisionScannerEditor: {
|
|
name: 'Replay vision scanner editor',
|
|
import: () => import('./frontend/replay_scanners/ScannerEditorScene'),
|
|
projectBased: true,
|
|
iconType: 'replay_vision',
|
|
layout: 'app-container',
|
|
},
|
|
ReplayVisionObservation: {
|
|
name: 'Replay vision observation',
|
|
import: () => import('./frontend/observations/ReplayObservation'),
|
|
projectBased: true,
|
|
iconType: 'replay_vision',
|
|
layout: 'app-container',
|
|
},
|
|
ReplayVisionAction: {
|
|
name: 'Replay vision action',
|
|
import: () => import('./frontend/replay_scanners/VisionActionScene'),
|
|
projectBased: true,
|
|
iconType: 'replay_vision',
|
|
layout: 'app-container',
|
|
},
|
|
ReplayVisionActionEditor: {
|
|
name: 'Replay vision action editor',
|
|
import: () => import('./frontend/replay_scanners/ActionEditorScene'),
|
|
projectBased: true,
|
|
iconType: 'replay_vision',
|
|
layout: 'app-container',
|
|
},
|
|
ReplayVisionActionRun: {
|
|
name: 'Replay vision action run',
|
|
import: () => import('./frontend/replay_scanners/VisionActionRunScene'),
|
|
projectBased: true,
|
|
iconType: 'replay_vision',
|
|
layout: 'app-container',
|
|
},
|
|
},
|
|
routes: {
|
|
'/replay-vision': ['ReplayVision', 'replayVision'],
|
|
'/replay-vision/observations/:observationId': ['ReplayVisionObservation', 'replayVisionObservation'],
|
|
'/replay-vision/actions/:actionId/runs/:runId': ['ReplayVisionActionRun', 'replayVisionActionRun'],
|
|
'/replay-vision/actions/:actionId/edit': ['ReplayVisionActionEditor', 'replayVisionActionEdit'],
|
|
'/replay-vision/actions/:actionId': ['ReplayVisionAction', 'replayVisionAction'],
|
|
'/replay-vision/:scannerId/actions/new': ['ReplayVisionActionEditor', 'replayVisionActionNew'],
|
|
'/replay-vision/:id/template': ['ReplayVisionScannerEditor', 'replayVisionScannerTemplate'],
|
|
'/replay-vision/:id/configure': ['ReplayVisionScannerEditor', 'replayVisionScannerConfigure'],
|
|
'/replay-vision/:id/triggers': ['ReplayVisionScannerEditor', 'replayVisionScannerTriggers'],
|
|
'/replay-vision/:id/self-driving': ['ReplayVisionScannerEditor', 'replayVisionScannerSelfDriving'],
|
|
'/replay-vision/:id': ['ReplayVisionScanner', 'replayVision'],
|
|
},
|
|
redirects: {
|
|
'/replay-vision/templates': '/replay-vision/new/template',
|
|
},
|
|
urls: {
|
|
replayVision:
|
|
/** @param id A UUID or 'new'. Omit for the scanner list page. */
|
|
(id?: string): string => (id ? `/replay-vision/${id}` : '/replay-vision'),
|
|
replayVisionTemplates: (): string => '/replay-vision/new/template',
|
|
replayVisionScannerTemplate: (id: string): string => `/replay-vision/${id}/template`,
|
|
replayVisionScannerConfigure: (id: string): string => `/replay-vision/${id}/configure`,
|
|
replayVisionScannerTriggers: (id: string): string => `/replay-vision/${id}/triggers`,
|
|
replayVisionScannerSelfDriving: (id: string): string => `/replay-vision/${id}/self-driving`,
|
|
replayVisionObservation: (observationId: string): string => `/replay-vision/observations/${observationId}`,
|
|
replayVisionAction: (actionId: string): string => `/replay-vision/actions/${actionId}`,
|
|
replayVisionActionRun: (actionId: string, runId: string): string =>
|
|
`/replay-vision/actions/${actionId}/runs/${runId}`,
|
|
replayVisionActionNew: (scannerId: string, mode?: 'group_summary' | 'alert'): string =>
|
|
// The mode is chosen before opening the editor (summary vs alert), carried as a query param so
|
|
// the editor renders one focused form instead of a type toggle that rewrites half the fields.
|
|
`/replay-vision/${scannerId}/actions/new${mode === 'alert' ? '?mode=alert' : ''}`,
|
|
replayVisionActionEdit: (actionId: string): string => `/replay-vision/actions/${actionId}/edit`,
|
|
},
|
|
fileSystemTypes: {},
|
|
treeItemsNew: [],
|
|
treeItemsProducts: [
|
|
{
|
|
path: 'Replay vision',
|
|
category: ProductItemCategory.BEHAVIOR,
|
|
intents: [ProductKey.REPLAY_VISION],
|
|
type: 'replay_vision',
|
|
iconType: 'replay_vision' as FileSystemIconType,
|
|
iconColor: [
|
|
'var(--color-product-session-replay-light)',
|
|
'var(--color-product-session-replay-dark)',
|
|
] as FileSystemIconColor,
|
|
href: urls.replayVision(),
|
|
flag: FEATURE_FLAGS.REPLAY_VISION,
|
|
sceneKey: 'ReplayVision',
|
|
sceneKeys: ['ReplayVision', 'ReplayVisionScanner'],
|
|
},
|
|
],
|
|
}
|