@flanksource/clicky-ui 0.3.40 → 0.3.41
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/README.md +24 -0
- package/dist/ai.cjs +10 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +10 -0
- package/dist/ai.js.map +1 -1
- package/dist/components/AccordionList.cjs +5 -1
- package/dist/components/AccordionList.cjs.map +1 -1
- package/dist/components/AccordionList.d.ts +3 -1
- package/dist/components/AccordionList.d.ts.map +1 -1
- package/dist/components/AccordionList.js +5 -1
- package/dist/components/AccordionList.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +9 -4
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +8 -3
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +3 -1
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
- package/dist/components/json-schema-form-accordion-array.d.ts +4 -1
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-accordion-array.js +3 -1
- package/dist/components/json-schema-form-accordion-array.js.map +1 -1
- package/dist/components/json-schema-form-array-view.cjs +63 -0
- package/dist/components/json-schema-form-array-view.cjs.map +1 -0
- package/dist/components/json-schema-form-array-view.d.ts +21 -0
- package/dist/components/json-schema-form-array-view.d.ts.map +1 -0
- package/dist/components/json-schema-form-array-view.js +63 -0
- package/dist/components/json-schema-form-array-view.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +3 -7
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +3 -7
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-conditionals.cjs +67 -0
- package/dist/components/json-schema-form-conditionals.cjs.map +1 -0
- package/dist/components/json-schema-form-conditionals.d.ts +9 -0
- package/dist/components/json-schema-form-conditionals.d.ts.map +1 -0
- package/dist/components/json-schema-form-conditionals.js +67 -0
- package/dist/components/json-schema-form-conditionals.js.map +1 -0
- package/dist/components/json-schema-form-defaults.cjs +68 -0
- package/dist/components/json-schema-form-defaults.cjs.map +1 -0
- package/dist/components/json-schema-form-defaults.d.ts +4 -0
- package/dist/components/json-schema-form-defaults.d.ts.map +1 -0
- package/dist/components/json-schema-form-defaults.js +68 -0
- package/dist/components/json-schema-form-defaults.js.map +1 -0
- package/dist/components/json-schema-form-errors.cjs +49 -31
- package/dist/components/json-schema-form-errors.cjs.map +1 -1
- package/dist/components/json-schema-form-errors.d.ts +4 -2
- package/dist/components/json-schema-form-errors.d.ts.map +1 -1
- package/dist/components/json-schema-form-errors.js +51 -33
- package/dist/components/json-schema-form-errors.js.map +1 -1
- package/dist/components/json-schema-form-filter.cjs +2 -1
- package/dist/components/json-schema-form-filter.cjs.map +1 -1
- package/dist/components/json-schema-form-filter.js +2 -1
- package/dist/components/json-schema-form-filter.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +6 -2
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
- package/dist/components/json-schema-form-item-summary.js +6 -2
- package/dist/components/json-schema-form-item-summary.js.map +1 -1
- package/dist/components/json-schema-form-layout.cjs +28 -19
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +8 -6
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +29 -20
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-listener-paths.cjs +52 -0
- package/dist/components/json-schema-form-listener-paths.cjs.map +1 -0
- package/dist/components/json-schema-form-listener-paths.d.ts +10 -0
- package/dist/components/json-schema-form-listener-paths.d.ts.map +1 -0
- package/dist/components/json-schema-form-listener-paths.js +52 -0
- package/dist/components/json-schema-form-listener-paths.js.map +1 -0
- package/dist/components/json-schema-form-listener-types.d.ts +22 -0
- package/dist/components/json-schema-form-listener-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-listeners.cjs +250 -0
- package/dist/components/json-schema-form-listeners.cjs.map +1 -0
- package/dist/components/json-schema-form-listeners.d.ts +13 -0
- package/dist/components/json-schema-form-listeners.d.ts.map +1 -0
- package/dist/components/json-schema-form-listeners.js +250 -0
- package/dist/components/json-schema-form-listeners.js.map +1 -0
- package/dist/components/json-schema-form-object-array-view.cjs +62 -0
- package/dist/components/json-schema-form-object-array-view.cjs.map +1 -0
- package/dist/components/json-schema-form-object-array-view.d.ts +14 -0
- package/dist/components/json-schema-form-object-array-view.d.ts.map +1 -0
- package/dist/components/json-schema-form-object-array-view.js +62 -0
- package/dist/components/json-schema-form-object-array-view.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +3 -0
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +3 -0
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +17 -9
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +19 -11
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +6 -99
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -8
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +5 -98
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +15 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.cjs +67 -16
- package/dist/components/json-schema-form-table-array.cjs.map +1 -1
- package/dist/components/json-schema-form-table-array.d.ts +4 -1
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.js +70 -19
- package/dist/components/json-schema-form-table-array.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +16 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +7 -1
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +2 -1
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +7 -1
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components.cjs +3 -2
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +3 -2
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +2 -1
- package/dist/components.js.map +1 -1
- package/dist/data/DataTable.cjs +9 -3
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +6 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +9 -3
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.cjs +43 -24
- package/dist/data/FixtureEditor/FixtureEditor.cjs.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.d.ts.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.js +43 -24
- package/dist/data/FixtureEditor/FixtureEditor.js.map +1 -1
- package/dist/data/Tree.cjs +10 -2
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +6 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +10 -2
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +143 -167
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts +5 -0
- package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.collection.cjs +18 -5
- package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection.d.ts +2 -0
- package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.collection.fixtures.d.ts +6 -0
- package/dist/data/ai/SessionInspector.collection.fixtures.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.js +18 -5
- package/dist/data/ai/SessionInspector.collection.js.map +1 -1
- package/dist/data/ai/SessionInspector.d.ts +24 -2
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs +105 -7
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +12 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.js +107 -9
- package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
- package/dist/data/ai/SessionInspector.js +144 -168
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.cjs +116 -0
- package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.legacy.d.ts +19 -0
- package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.legacy.js +116 -0
- package/dist/data/ai/SessionInspector.legacy.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +3 -0
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.panels.js +3 -0
- package/dist/data/ai/SessionInspector.panels.js.map +1 -1
- package/dist/data/ai/SessionInspector.plan.cjs +29 -12
- package/dist/data/ai/SessionInspector.plan.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.plan.js +30 -13
- package/dist/data/ai/SessionInspector.plan.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.cjs +44 -0
- package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.remote-view.d.ts +11 -0
- package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.remote-view.js +44 -0
- package/dist/data/ai/SessionInspector.remote-view.js.map +1 -0
- package/dist/data/ai/SessionInspector.remote.cjs +275 -0
- package/dist/data/ai/SessionInspector.remote.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.remote.d.ts +57 -0
- package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.remote.js +275 -0
- package/dist/data/ai/SessionInspector.remote.js.map +1 -0
- package/dist/data/ai/SessionInspector.summary.cjs +0 -156
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.summary.d.ts +0 -3
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.summary.js +2 -158
- package/dist/data/ai/SessionInspector.summary.js.map +1 -1
- package/dist/data/ai/SessionInspector.tab-state.cjs +15 -0
- package/dist/data/ai/SessionInspector.tab-state.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.tab-state.d.ts +3 -0
- package/dist/data/ai/SessionInspector.tab-state.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.tab-state.js +15 -0
- package/dist/data/ai/SessionInspector.tab-state.js.map +1 -0
- package/dist/data/ai/SessionInspector.tabs.model.cjs +31 -18
- package/dist/data/ai/SessionInspector.tabs.model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.tabs.model.d.ts +3 -1
- package/dist/data/ai/SessionInspector.tabs.model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.tabs.model.js +32 -19
- package/dist/data/ai/SessionInspector.tabs.model.js.map +1 -1
- package/dist/data/ai/SessionInspector.verification.cjs +53 -0
- package/dist/data/ai/SessionInspector.verification.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.verification.d.ts +7 -0
- package/dist/data/ai/SessionInspector.verification.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.verification.js +53 -0
- package/dist/data/ai/SessionInspector.verification.js.map +1 -0
- package/dist/data/ai/SessionViewer.model.cjs +7 -1
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +21 -3
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +7 -1
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +13 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/index.d.ts +3 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/devtools/useDebugStream.cjs +5 -1
- package/dist/devtools/useDebugStream.cjs.map +1 -1
- package/dist/devtools/useDebugStream.d.ts.map +1 -1
- package/dist/devtools/useDebugStream.js +6 -2
- package/dist/devtools/useDebugStream.js.map +1 -1
- package/dist/hooks/event-source-provider.cjs +9 -0
- package/dist/hooks/event-source-provider.cjs.map +1 -0
- package/dist/hooks/event-source-provider.d.ts +15 -0
- package/dist/hooks/event-source-provider.d.ts.map +1 -0
- package/dist/hooks/event-source-provider.js +9 -0
- package/dist/hooks/event-source-provider.js.map +1 -0
- package/dist/hooks/event-source.cjs +11 -0
- package/dist/hooks/event-source.cjs.map +1 -0
- package/dist/hooks/event-source.d.ts +22 -0
- package/dist/hooks/event-source.d.ts.map +1 -0
- package/dist/hooks/event-source.js +11 -0
- package/dist/hooks/event-source.js.map +1 -0
- package/dist/hooks/use-log-tail.cjs +5 -1
- package/dist/hooks/use-log-tail.cjs.map +1 -1
- package/dist/hooks/use-log-tail.d.ts.map +1 -1
- package/dist/hooks/use-log-tail.js +5 -1
- package/dist/hooks/use-log-tail.js.map +1 -1
- package/dist/hooks/use-prompts.cjs +5 -1
- package/dist/hooks/use-prompts.cjs.map +1 -1
- package/dist/hooks/use-prompts.d.ts.map +1 -1
- package/dist/hooks/use-prompts.js +6 -2
- package/dist/hooks/use-prompts.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +9 -2
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +10 -3
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks.cjs +4 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/icons/programmingCatalog.cjs +34 -34
- package/dist/icons/programmingCatalog.cjs.map +1 -1
- package/dist/icons/programmingCatalog.js +34 -34
- package/dist/icons/programmingCatalog.js.map +1 -1
- package/dist/index.cjs +9 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/monaco/MonacoEditor.cjs +4 -1
- package/dist/monaco/MonacoEditor.cjs.map +1 -1
- package/dist/monaco/MonacoEditor.d.ts +1 -1
- package/dist/monaco/MonacoEditor.d.ts.map +1 -1
- package/dist/monaco/MonacoEditor.js +4 -1
- package/dist/monaco/MonacoEditor.js.map +1 -1
- package/dist/monaco/types.d.ts +2 -1
- package/dist/monaco/types.d.ts.map +1 -1
- package/dist/overlay/CommandPalette.cjs +14 -4
- package/dist/overlay/CommandPalette.cjs.map +1 -1
- package/dist/overlay/CommandPalette.d.ts +5 -1
- package/dist/overlay/CommandPalette.d.ts.map +1 -1
- package/dist/overlay/CommandPalette.js +14 -4
- package/dist/overlay/CommandPalette.js.map +1 -1
- package/dist/overlay/CommandPaletteList.cjs +5 -0
- package/dist/overlay/CommandPaletteList.cjs.map +1 -1
- package/dist/overlay/CommandPaletteList.d.ts +4 -2
- package/dist/overlay/CommandPaletteList.d.ts.map +1 -1
- package/dist/overlay/CommandPaletteList.js +5 -0
- package/dist/overlay/CommandPaletteList.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +1 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.js +1 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +29 -26
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +9 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +29 -26
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.cjs +62 -256
- package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.js +64 -258
- package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
- package/dist/rpc/OperationEntityPicker.cjs +185 -0
- package/dist/rpc/OperationEntityPicker.cjs.map +1 -0
- package/dist/rpc/OperationEntityPicker.d.ts +51 -0
- package/dist/rpc/OperationEntityPicker.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPicker.js +185 -0
- package/dist/rpc/OperationEntityPicker.js.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.cjs +39 -0
- package/dist/rpc/OperationEntityPicker.model.cjs.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.d.ts +27 -0
- package/dist/rpc/OperationEntityPicker.model.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.js +39 -0
- package/dist/rpc/OperationEntityPicker.model.js.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.cjs +85 -0
- package/dist/rpc/operationCatalogRowSelection.cjs.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.d.ts +57 -0
- package/dist/rpc/operationCatalogRowSelection.d.ts.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.js +85 -0
- package/dist/rpc/operationCatalogRowSelection.js.map +1 -0
- package/dist/rpc/operationEntityPicker.fixtures.d.ts +13 -0
- package/dist/rpc/operationEntityPicker.fixtures.d.ts.map +1 -0
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +4 -1
- package/schemas/json-schema-form.schema.json +566 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { useRef, useState, useEffect, useMemo } from "react";
|
|
2
|
+
import { useEventSourceFactory } from "../../hooks/event-source.js";
|
|
3
|
+
const TERMINAL_SESSION_LIFECYCLES = [
|
|
4
|
+
"succeeded",
|
|
5
|
+
"partial",
|
|
6
|
+
"failed",
|
|
7
|
+
"cancelled",
|
|
8
|
+
"interrupted",
|
|
9
|
+
"completed"
|
|
10
|
+
];
|
|
11
|
+
function isTerminalSessionLifecycle(status) {
|
|
12
|
+
return status !== void 0 && TERMINAL_SESSION_LIFECYCLES.includes(status);
|
|
13
|
+
}
|
|
14
|
+
function sessionFollowUrl(src) {
|
|
15
|
+
const hashAt = src.indexOf("#");
|
|
16
|
+
const base = hashAt === -1 ? src : src.slice(0, hashAt);
|
|
17
|
+
const hash = hashAt === -1 ? "" : src.slice(hashAt);
|
|
18
|
+
const separator = !base.includes("?") ? "?" : base.endsWith("?") || base.endsWith("&") ? "" : "&";
|
|
19
|
+
return `${base}${separator}follow=1${hash}`;
|
|
20
|
+
}
|
|
21
|
+
async function fetchRemoteSession(src, signal) {
|
|
22
|
+
const response = await fetch(src, {
|
|
23
|
+
headers: { Accept: "application/json" },
|
|
24
|
+
...signal ? { signal } : {}
|
|
25
|
+
});
|
|
26
|
+
const body = await response.text();
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`Failed to load session ${src} (HTTP ${response.status}): ${errorDetail(body)}`
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
let parsed;
|
|
33
|
+
try {
|
|
34
|
+
parsed = JSON.parse(body);
|
|
35
|
+
} catch (cause) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
`Session ${src} returned invalid JSON (${String(cause)}): ${body.slice(0, 200)}`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
if (!isRecord(parsed)) {
|
|
41
|
+
throw new Error(
|
|
42
|
+
`Session ${src} returned ${Array.isArray(parsed) ? "an array" : String(parsed)}, expected a session object`
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return parsed;
|
|
46
|
+
}
|
|
47
|
+
function mergeSessionMessages(base, incoming) {
|
|
48
|
+
const merged = [...base ?? []];
|
|
49
|
+
for (const message of incoming) {
|
|
50
|
+
const index = merged.findIndex((existing) => existing.id === message.id);
|
|
51
|
+
if (index === -1) merged.push(message);
|
|
52
|
+
else merged[index] = message;
|
|
53
|
+
}
|
|
54
|
+
return merged;
|
|
55
|
+
}
|
|
56
|
+
function openRemoteSession(src, {
|
|
57
|
+
follow,
|
|
58
|
+
eventSourceFactory,
|
|
59
|
+
onChange
|
|
60
|
+
}) {
|
|
61
|
+
const url = sessionFollowUrl(src);
|
|
62
|
+
const aborter = new AbortController();
|
|
63
|
+
const streamed = /* @__PURE__ */ new Map();
|
|
64
|
+
let closed = false;
|
|
65
|
+
let source;
|
|
66
|
+
let state = { loading: true };
|
|
67
|
+
let revision;
|
|
68
|
+
let facets;
|
|
69
|
+
let seq = 0;
|
|
70
|
+
let generation = 0;
|
|
71
|
+
const emit = (next) => {
|
|
72
|
+
if (closed) return;
|
|
73
|
+
state = next;
|
|
74
|
+
onChange(next);
|
|
75
|
+
};
|
|
76
|
+
const stopFollowing = () => {
|
|
77
|
+
source == null ? void 0 : source.close();
|
|
78
|
+
source = void 0;
|
|
79
|
+
};
|
|
80
|
+
const fail = (message) => {
|
|
81
|
+
stopFollowing();
|
|
82
|
+
emit({ ...state, loading: false, error: message });
|
|
83
|
+
};
|
|
84
|
+
const refresh = async () => {
|
|
85
|
+
var _a;
|
|
86
|
+
const current = ++generation;
|
|
87
|
+
const startedAt = seq;
|
|
88
|
+
const fetched = await fetchRemoteSession(src, aborter.signal);
|
|
89
|
+
if (closed || current !== generation) return void 0;
|
|
90
|
+
const fetchedIds = new Set((_a = fetched.messages) == null ? void 0 : _a.map((message) => message.id));
|
|
91
|
+
const keep = [...streamed.values()].filter((entry) => entry.seq > startedAt || !fetchedIds.has(entry.message.id)).map((entry) => entry.message);
|
|
92
|
+
const session = {
|
|
93
|
+
...fetched,
|
|
94
|
+
messages: mergeSessionMessages(fetched.messages, keep)
|
|
95
|
+
};
|
|
96
|
+
if (typeof fetched.revision === "number") {
|
|
97
|
+
revision = Math.max(revision ?? fetched.revision, fetched.revision);
|
|
98
|
+
}
|
|
99
|
+
emit({ ...state, session, loading: false });
|
|
100
|
+
return session;
|
|
101
|
+
};
|
|
102
|
+
const readFrame = (event) => {
|
|
103
|
+
try {
|
|
104
|
+
return JSON.parse(event.data);
|
|
105
|
+
} catch (cause) {
|
|
106
|
+
fail(`Unparseable ${event.type} frame from ${url}: ${String(cause)}`);
|
|
107
|
+
return void 0;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const onEntry = (event) => {
|
|
111
|
+
const message = readFrame(event);
|
|
112
|
+
if (message === void 0) return;
|
|
113
|
+
if (!isRecord(message) || typeof message.id !== "string" || !message.id) {
|
|
114
|
+
fail(`Entry frame from ${url} has no message id: ${String(event.data)}`);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const entry = message;
|
|
118
|
+
streamed.set(message.id, { message: entry, seq: ++seq });
|
|
119
|
+
const session = state.session;
|
|
120
|
+
emit({
|
|
121
|
+
...state,
|
|
122
|
+
session: { ...session, messages: mergeSessionMessages(session.messages, [entry]) }
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
const onState = (event) => {
|
|
126
|
+
const frame = readFrame(event);
|
|
127
|
+
if (frame === void 0) return;
|
|
128
|
+
if (!isRecord(frame) || typeof frame.revision !== "number" || typeof frame.lifecycleStatus !== "string" || typeof frame.facets !== "string") {
|
|
129
|
+
fail(`State frame from ${url} lacks a numeric revision, a lifecycleStatus, and facets: ${String(event.data)}`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const next = frame;
|
|
133
|
+
emit({
|
|
134
|
+
...state,
|
|
135
|
+
session: {
|
|
136
|
+
...state.session,
|
|
137
|
+
lifecycleStatus: next.lifecycleStatus,
|
|
138
|
+
...typeof next.activityState === "string" ? { activityState: next.activityState } : {}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
const revisionIncreased = revision === void 0 || next.revision > revision;
|
|
142
|
+
const facetsChanged = facets !== void 0 && next.facets !== facets;
|
|
143
|
+
facets = next.facets;
|
|
144
|
+
if (revisionIncreased) revision = next.revision;
|
|
145
|
+
if (revisionIncreased || facetsChanged) {
|
|
146
|
+
refresh().catch((reason) => {
|
|
147
|
+
if (!closed) fail(errorMessage(reason));
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (isTerminalSessionLifecycle(next.lifecycleStatus)) stopFollowing();
|
|
151
|
+
};
|
|
152
|
+
const startFollowing = () => {
|
|
153
|
+
const es = eventSourceFactory(url);
|
|
154
|
+
source = es;
|
|
155
|
+
let received = false;
|
|
156
|
+
const onError = (event) => {
|
|
157
|
+
const data = event.data;
|
|
158
|
+
if (typeof data === "string") {
|
|
159
|
+
const frame = readFrame(event);
|
|
160
|
+
if (frame === void 0) return;
|
|
161
|
+
const reported = isRecord(frame) && typeof frame.error === "string" ? frame.error : data;
|
|
162
|
+
fail(`Session stream ${url} reported an error: ${reported}`);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (received && es.readyState !== 2) return;
|
|
166
|
+
fail(
|
|
167
|
+
received ? `Lost the session stream ${url}` : `Could not connect to the session stream ${url}`
|
|
168
|
+
);
|
|
169
|
+
};
|
|
170
|
+
es.addEventListener("entry", (event) => {
|
|
171
|
+
received = true;
|
|
172
|
+
onEntry(event);
|
|
173
|
+
});
|
|
174
|
+
es.addEventListener("state", (event) => {
|
|
175
|
+
received = true;
|
|
176
|
+
onState(event);
|
|
177
|
+
});
|
|
178
|
+
es.addEventListener("error", onError);
|
|
179
|
+
};
|
|
180
|
+
const loaded = refresh().then(
|
|
181
|
+
(session) => {
|
|
182
|
+
if (!session) throw new Error(`Session ${src} was closed before it loaded`);
|
|
183
|
+
const lifecycle = session.lifecycleStatus;
|
|
184
|
+
const wanted = follow ?? (lifecycle !== void 0 && !isTerminalSessionLifecycle(lifecycle));
|
|
185
|
+
if (wanted && !closed) startFollowing();
|
|
186
|
+
return session;
|
|
187
|
+
},
|
|
188
|
+
(reason) => {
|
|
189
|
+
if (!closed) fail(errorMessage(reason));
|
|
190
|
+
throw reason;
|
|
191
|
+
}
|
|
192
|
+
);
|
|
193
|
+
return {
|
|
194
|
+
loaded,
|
|
195
|
+
close: () => {
|
|
196
|
+
closed = true;
|
|
197
|
+
aborter.abort();
|
|
198
|
+
stopFollowing();
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const IDLE = { loading: false };
|
|
203
|
+
const LOADING = { loading: true };
|
|
204
|
+
function useRemoteSession(src, { follow } = {}) {
|
|
205
|
+
const eventSourceFactory = useEventSourceFactory();
|
|
206
|
+
const factoryRef = useRef(eventSourceFactory);
|
|
207
|
+
factoryRef.current = eventSourceFactory;
|
|
208
|
+
const [snapshot, setSnapshot] = useState();
|
|
209
|
+
useEffect(() => {
|
|
210
|
+
if (src === void 0) return void 0;
|
|
211
|
+
setSnapshot({ src, state: LOADING });
|
|
212
|
+
const handle = openRemoteSession(src, {
|
|
213
|
+
...follow === void 0 ? {} : { follow },
|
|
214
|
+
eventSourceFactory: factoryRef.current,
|
|
215
|
+
onChange: (state) => setSnapshot({ src, state })
|
|
216
|
+
});
|
|
217
|
+
handle.loaded.catch(() => void 0);
|
|
218
|
+
return handle.close;
|
|
219
|
+
}, [src, follow]);
|
|
220
|
+
if (src === void 0) return IDLE;
|
|
221
|
+
return (snapshot == null ? void 0 : snapshot.src) === src ? snapshot.state : LOADING;
|
|
222
|
+
}
|
|
223
|
+
function useRemoteCollection(collection, options = {}) {
|
|
224
|
+
const current = collection == null ? void 0 : collection.sessions.find(
|
|
225
|
+
(item) => item.id === collection.currentSessionId
|
|
226
|
+
);
|
|
227
|
+
const src = current && !current.session ? current.src : void 0;
|
|
228
|
+
const remote = useRemoteSession(src, options);
|
|
229
|
+
return useMemo(() => {
|
|
230
|
+
if (!collection) return IDLE;
|
|
231
|
+
if (src === void 0 || !current) return { collection, loading: false };
|
|
232
|
+
const status = {
|
|
233
|
+
loading: remote.loading,
|
|
234
|
+
...remote.error ? { error: remote.error } : {}
|
|
235
|
+
};
|
|
236
|
+
if (!remote.session) return status;
|
|
237
|
+
const session = remote.session;
|
|
238
|
+
return {
|
|
239
|
+
...status,
|
|
240
|
+
collection: {
|
|
241
|
+
...collection,
|
|
242
|
+
sessions: collection.sessions.map(
|
|
243
|
+
(item) => item === current ? { ...item, session } : item
|
|
244
|
+
)
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
}, [collection, current, src, remote]);
|
|
248
|
+
}
|
|
249
|
+
function errorDetail(body) {
|
|
250
|
+
const text = body.trim();
|
|
251
|
+
if (!text) return "empty response body";
|
|
252
|
+
try {
|
|
253
|
+
const parsed = JSON.parse(text);
|
|
254
|
+
if (isRecord(parsed) && typeof parsed.error === "string") return parsed.error;
|
|
255
|
+
} catch {
|
|
256
|
+
}
|
|
257
|
+
return text;
|
|
258
|
+
}
|
|
259
|
+
function errorMessage(reason) {
|
|
260
|
+
return reason instanceof Error ? reason.message : String(reason);
|
|
261
|
+
}
|
|
262
|
+
function isRecord(value) {
|
|
263
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
264
|
+
}
|
|
265
|
+
export {
|
|
266
|
+
TERMINAL_SESSION_LIFECYCLES,
|
|
267
|
+
fetchRemoteSession,
|
|
268
|
+
isTerminalSessionLifecycle,
|
|
269
|
+
mergeSessionMessages,
|
|
270
|
+
openRemoteSession,
|
|
271
|
+
sessionFollowUrl,
|
|
272
|
+
useRemoteCollection,
|
|
273
|
+
useRemoteSession
|
|
274
|
+
};
|
|
275
|
+
//# sourceMappingURL=SessionInspector.remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionInspector.remote.js","sources":["../../../src/data/ai/SessionInspector.remote.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useEventSourceFactory,\n type EventSourceFactory,\n type EventSourceLike,\n} from \"../../hooks/event-source\";\nimport type { SessionCollectionInput } from \"./SessionInspector.collection-types\";\nimport type {\n SessionUIMessage,\n UnifiedSessionInput,\n} from \"./SessionViewer.unified\";\n\n// SessionInspector.remote loads a session from a URL and follows it live.\n// The contract (captain `SessionHandler`):\n// GET {src} Accept: application/json → one UnifiedSessionInput; a non-2xx\n// body is `{error, …}` JSON or plain text, surfaced verbatim.\n// GET {src}?follow=1 (SSE) → `entry` frames (one SessionUIMessage, upserted\n// by id), `state` frames ({revision, lifecycleStatus,\n// activityState, facets}), `error` frames ({error}) and `: ping`\n// comments. The server closes the stream once the session is\n// terminal.\n// A `state` frame with a higher revision means aggregate facets (plan,\n// approvals, files, …) changed, so the aggregate is refetched; entries\n// streamed while it was in flight stay merged on top. `facets` is an opaque\n// fingerprint of the non-message session facets (plan, todos, files, approval\n// requests): the first frame's value is the baseline (no refetch from it\n// alone), and any later frame whose `facets` differs from the last one seen\n// also triggers a refetch, independently of `revision`.\n\nexport const TERMINAL_SESSION_LIFECYCLES = [\n \"succeeded\",\n \"partial\",\n \"failed\",\n \"cancelled\",\n \"interrupted\",\n \"completed\",\n] as const;\n\nexport function isTerminalSessionLifecycle(status: string | undefined) {\n return (\n status !== undefined &&\n (TERMINAL_SESSION_LIFECYCLES as readonly string[]).includes(status)\n );\n}\n\nexport interface RemoteSessionOptions {\n /** Force (`true`) or suppress (`false`) the live stream. By default a\n * session follows only while it reports a non-terminal `lifecycleStatus`;\n * a session that reports none is not followed. */\n follow?: boolean;\n}\n\nexport interface RemoteSessionState {\n session?: UnifiedSessionInput;\n error?: string;\n loading: boolean;\n}\n\n/** The payload of a follow stream's `state` frame. */\nexport interface SessionFollowState {\n revision: number;\n lifecycleStatus: string;\n activityState: string;\n /** Opaque fingerprint of non-message session facets (plan, todos, files,\n * approval requests). Always sent by captain — see the module doc above\n * for how it's used to decide whether to refetch. */\n facets: string;\n}\n\nexport interface RemoteSessionHandle {\n /** Settles with the first fetched session, or rejects with the load error\n * (which `onChange` has already reported as `error`). */\n loaded: Promise<UnifiedSessionInput>;\n close: () => void;\n}\n\n/** `src` with `follow=1` appended to its query, keeping any fragment last. */\nexport function sessionFollowUrl(src: string) {\n const hashAt = src.indexOf(\"#\");\n const base = hashAt === -1 ? src : src.slice(0, hashAt);\n const hash = hashAt === -1 ? \"\" : src.slice(hashAt);\n const separator = !base.includes(\"?\")\n ? \"?\"\n : base.endsWith(\"?\") || base.endsWith(\"&\")\n ? \"\"\n : \"&\";\n return `${base}${separator}follow=1${hash}`;\n}\n\nexport async function fetchRemoteSession(\n src: string,\n signal?: AbortSignal,\n): Promise<UnifiedSessionInput> {\n const response = await fetch(src, {\n headers: { Accept: \"application/json\" },\n ...(signal ? { signal } : {}),\n });\n const body = await response.text();\n if (!response.ok) {\n throw new Error(\n `Failed to load session ${src} (HTTP ${response.status}): ${errorDetail(body)}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch (cause) {\n throw new Error(\n `Session ${src} returned invalid JSON (${String(cause)}): ${body.slice(0, 200)}`,\n );\n }\n if (!isRecord(parsed)) {\n throw new Error(\n `Session ${src} returned ${Array.isArray(parsed) ? \"an array\" : String(parsed)}, expected a session object`,\n );\n }\n return parsed as UnifiedSessionInput;\n}\n\n/** Upserts messages by id: a known id is replaced in place, a new one appended. */\nexport function mergeSessionMessages(\n base: readonly SessionUIMessage[] | undefined,\n incoming: readonly SessionUIMessage[],\n): SessionUIMessage[] {\n const merged = [...(base ?? [])];\n for (const message of incoming) {\n const index = merged.findIndex((existing) => existing.id === message.id);\n if (index === -1) merged.push(message);\n else merged[index] = message;\n }\n return merged;\n}\n\n/** Fetches `src`, then follows it when wanted, reporting every change through\n * `onChange`. Nothing is reported after `close()`. */\nexport function openRemoteSession(\n src: string,\n {\n follow,\n eventSourceFactory,\n onChange,\n }: RemoteSessionOptions & {\n eventSourceFactory: EventSourceFactory;\n onChange: (state: RemoteSessionState) => void;\n },\n): RemoteSessionHandle {\n const url = sessionFollowUrl(src);\n const aborter = new AbortController();\n const streamed = new Map<string, { message: SessionUIMessage; seq: number }>();\n let closed = false;\n let source: EventSourceLike | undefined;\n let state: RemoteSessionState = { loading: true };\n let revision: number | undefined;\n let facets: string | undefined;\n let seq = 0;\n let generation = 0;\n\n const emit = (next: RemoteSessionState) => {\n if (closed) return;\n state = next;\n onChange(next);\n };\n const stopFollowing = () => {\n source?.close();\n source = undefined;\n };\n const fail = (message: string) => {\n stopFollowing();\n emit({ ...state, loading: false, error: message });\n };\n\n const refresh = async () => {\n const current = ++generation;\n const startedAt = seq;\n const fetched = await fetchRemoteSession(src, aborter.signal);\n if (closed || current !== generation) return undefined;\n const fetchedIds = new Set(fetched.messages?.map((message) => message.id));\n const keep = [...streamed.values()]\n .filter((entry) => entry.seq > startedAt || !fetchedIds.has(entry.message.id))\n .map((entry) => entry.message);\n const session = {\n ...fetched,\n messages: mergeSessionMessages(fetched.messages, keep),\n };\n if (typeof fetched.revision === \"number\") {\n revision = Math.max(revision ?? fetched.revision, fetched.revision);\n }\n emit({ ...state, session, loading: false });\n return session;\n };\n\n const readFrame = (event: Event): unknown => {\n try {\n return JSON.parse((event as MessageEvent).data as string);\n } catch (cause) {\n fail(`Unparseable ${event.type} frame from ${url}: ${String(cause)}`);\n return undefined;\n }\n };\n\n const onEntry = (event: Event) => {\n const message = readFrame(event);\n if (message === undefined) return;\n if (!isRecord(message) || typeof message.id !== \"string\" || !message.id) {\n fail(`Entry frame from ${url} has no message id: ${String((event as MessageEvent).data)}`);\n return;\n }\n const entry = message as unknown as SessionUIMessage;\n streamed.set(message.id, { message: entry, seq: ++seq });\n const session = state.session!;\n emit({\n ...state,\n session: { ...session, messages: mergeSessionMessages(session.messages, [entry]) },\n });\n };\n\n const onState = (event: Event) => {\n const frame = readFrame(event);\n if (frame === undefined) return;\n if (\n !isRecord(frame) ||\n typeof frame.revision !== \"number\" ||\n typeof frame.lifecycleStatus !== \"string\" ||\n typeof frame.facets !== \"string\"\n ) {\n fail(`State frame from ${url} lacks a numeric revision, a lifecycleStatus, and facets: ${String((event as MessageEvent).data)}`);\n return;\n }\n const next = frame as unknown as SessionFollowState;\n emit({\n ...state,\n session: {\n ...state.session,\n lifecycleStatus: next.lifecycleStatus,\n ...(typeof next.activityState === \"string\" ? { activityState: next.activityState } : {}),\n },\n });\n const revisionIncreased = revision === undefined || next.revision > revision;\n // The first state frame's facets is the baseline: it never triggers a\n // refetch by itself, only a higher revision does (as before facets\n // existed). Any later frame whose facets differ from the last one seen\n // does trigger a refetch, independently of revision.\n const facetsChanged = facets !== undefined && next.facets !== facets;\n facets = next.facets;\n if (revisionIncreased) revision = next.revision;\n if (revisionIncreased || facetsChanged) {\n refresh().catch((reason: unknown) => {\n if (!closed) fail(errorMessage(reason));\n });\n }\n if (isTerminalSessionLifecycle(next.lifecycleStatus)) stopFollowing();\n };\n\n const startFollowing = () => {\n const es = eventSourceFactory(url);\n source = es;\n let received = false;\n const onError = (event: Event) => {\n const data = (event as MessageEvent).data;\n if (typeof data === \"string\") {\n const frame = readFrame(event);\n if (frame === undefined) return;\n const reported = isRecord(frame) && typeof frame.error === \"string\" ? frame.error : data;\n fail(`Session stream ${url} reported an error: ${reported}`);\n return;\n }\n // After data has arrived, a dropped connection reconnects on its own and\n // the server replays; entries upsert by id, so the replay is idempotent.\n if (received && es.readyState !== 2) return;\n fail(\n received\n ? `Lost the session stream ${url}`\n : `Could not connect to the session stream ${url}`,\n );\n };\n es.addEventListener(\"entry\", (event) => {\n received = true;\n onEntry(event);\n });\n es.addEventListener(\"state\", (event) => {\n received = true;\n onState(event);\n });\n es.addEventListener(\"error\", onError);\n };\n\n const loaded = refresh().then(\n (session) => {\n if (!session) throw new Error(`Session ${src} was closed before it loaded`);\n const lifecycle = session.lifecycleStatus;\n const wanted =\n follow ?? (lifecycle !== undefined && !isTerminalSessionLifecycle(lifecycle));\n if (wanted && !closed) startFollowing();\n return session;\n },\n (reason: unknown) => {\n if (!closed) fail(errorMessage(reason));\n throw reason;\n },\n );\n\n return {\n loaded,\n close: () => {\n closed = true;\n aborter.abort();\n stopFollowing();\n },\n };\n}\n\nconst IDLE: RemoteSessionState = { loading: false };\nconst LOADING: RemoteSessionState = { loading: true };\n\n/** Loads `src` (undefined loads nothing) and follows it on demand; see\n * `RemoteSessionOptions.follow`. Changing `src` or `follow`, or unmounting,\n * closes the previous stream. */\nexport function useRemoteSession(\n src: string | undefined,\n { follow }: RemoteSessionOptions = {},\n): RemoteSessionState {\n const eventSourceFactory = useEventSourceFactory();\n const factoryRef = useRef(eventSourceFactory);\n factoryRef.current = eventSourceFactory;\n const [snapshot, setSnapshot] = useState<{\n src: string;\n state: RemoteSessionState;\n }>();\n\n useEffect(() => {\n if (src === undefined) return undefined;\n setSnapshot({ src, state: LOADING });\n const handle = openRemoteSession(src, {\n ...(follow === undefined ? {} : { follow }),\n eventSourceFactory: factoryRef.current,\n onChange: (state) => setSnapshot({ src, state }),\n });\n // A load failure already reached the state through onChange as `error`.\n handle.loaded.catch(() => undefined);\n return handle.close;\n }, [src, follow]);\n\n if (src === undefined) return IDLE;\n return snapshot?.src === src ? snapshot.state : LOADING;\n}\n\nexport interface RemoteCollectionState {\n /** The collection with its current item's session loaded, once it is. */\n collection?: SessionCollectionInput;\n error?: string;\n loading: boolean;\n}\n\n/** Loads the current item of a collection when it carries only `src`, so the\n * hierarchy (which requires a loaded current session) can render. */\nexport function useRemoteCollection(\n collection: SessionCollectionInput | undefined,\n options: RemoteSessionOptions = {},\n): RemoteCollectionState {\n const current = collection?.sessions.find(\n (item) => item.id === collection.currentSessionId,\n );\n const src = current && !current.session ? current.src : undefined;\n const remote = useRemoteSession(src, options);\n return useMemo(() => {\n if (!collection) return IDLE;\n if (src === undefined || !current) return { collection, loading: false };\n const status = {\n loading: remote.loading,\n ...(remote.error ? { error: remote.error } : {}),\n };\n if (!remote.session) return status;\n const session = remote.session;\n return {\n ...status,\n collection: {\n ...collection,\n sessions: collection.sessions.map((item) =>\n item === current ? { ...item, session } : item,\n ),\n },\n };\n }, [collection, current, src, remote]);\n}\n\nfunction errorDetail(body: string) {\n const text = body.trim();\n if (!text) return \"empty response body\";\n try {\n const parsed: unknown = JSON.parse(text);\n if (isRecord(parsed) && typeof parsed.error === \"string\") return parsed.error;\n } catch {\n // Not JSON: the text itself is the detail.\n }\n return text;\n}\n\nfunction errorMessage(reason: unknown) {\n return reason instanceof Error ? reason.message : String(reason);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -5,20 +5,11 @@ const Icon = require("../Icon.cjs");
|
|
|
5
5
|
const effortIcons = require("../chat/effort-icons.cjs");
|
|
6
6
|
const providerIcons = require("../chat/provider-icons.cjs");
|
|
7
7
|
const agentActionIcons = require("./agent-action-icons.cjs");
|
|
8
|
-
const sessionCost = require("./session-cost.cjs");
|
|
9
8
|
const SessionInspector_model = require("./SessionInspector.model.cjs");
|
|
10
9
|
const SessionViewer_header = require("./SessionViewer.header.cjs");
|
|
11
10
|
const SessionViewer_model = require("./SessionViewer.model.cjs");
|
|
12
|
-
const permissionModeVisuals = require("./SpecRuntimeEditor/permission-mode-visuals.cjs");
|
|
13
11
|
const UiRobotAi = require("../../icons/components/UiRobotAi.cjs");
|
|
14
12
|
const UiTimer = require("../../icons/components/UiTimer.cjs");
|
|
15
|
-
const UiClock = require("../../icons/components/UiClock.cjs");
|
|
16
|
-
const UiServerProcess = require("../../icons/components/UiServerProcess.cjs");
|
|
17
|
-
const UiFingerprint = require("../../icons/components/UiFingerprint.cjs");
|
|
18
|
-
const UiCoins = require("../../icons/components/UiCoins.cjs");
|
|
19
|
-
const tokens = require("../../lib/tokens.cjs");
|
|
20
|
-
const SpecRuntimeEditor_sandboxModel = require("./SpecRuntimeEditor.sandbox-model.cjs");
|
|
21
|
-
const UiShield = require("../../icons/components/UiShield.cjs");
|
|
22
13
|
function SessionInspectorHeader({
|
|
23
14
|
session
|
|
24
15
|
}) {
|
|
@@ -56,152 +47,5 @@ function SessionInspectorHeader({
|
|
|
56
47
|
] })
|
|
57
48
|
] }) });
|
|
58
49
|
}
|
|
59
|
-
function SessionInspectorSidebar({
|
|
60
|
-
session
|
|
61
|
-
}) {
|
|
62
|
-
var _a;
|
|
63
|
-
const runtime = SessionInspector_model.runtimeDescriptor(session.modelMode);
|
|
64
|
-
const RuntimeIcon = (runtime == null ? void 0 : runtime.icon) ?? UiRobotAi.UiRobotAi;
|
|
65
|
-
const usage = session.usage ?? session.cost;
|
|
66
|
-
const tokens$1 = sessionCost.tokenTotal(usage);
|
|
67
|
-
const cost = sessionCost.costTotal(session.cost);
|
|
68
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: "border-t border-border bg-muted/10 p-density-4 lg:min-h-0 lg:overflow-auto lg:border-l lg:border-t-0", children: [
|
|
69
|
-
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
70
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Session details" }),
|
|
71
|
-
/* @__PURE__ */ jsxRuntime.jsxs("dl", { className: "mt-density-3 space-y-density-3", children: [
|
|
72
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
73
|
-
DetailRow,
|
|
74
|
-
{
|
|
75
|
-
icon: UiClock.UiClock,
|
|
76
|
-
label: "Started",
|
|
77
|
-
value: SessionInspector_model.formatDate(session.startedAt)
|
|
78
|
-
}
|
|
79
|
-
),
|
|
80
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
81
|
-
DetailRow,
|
|
82
|
-
{
|
|
83
|
-
icon: UiRobotAi.UiRobotAi,
|
|
84
|
-
label: "Connection",
|
|
85
|
-
value: session.provider || session.source
|
|
86
|
-
}
|
|
87
|
-
),
|
|
88
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "session-runtime-mode", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
89
|
-
DetailRow,
|
|
90
|
-
{
|
|
91
|
-
icon: RuntimeIcon,
|
|
92
|
-
label: "Mode",
|
|
93
|
-
value: (runtime == null ? void 0 : runtime.mode) || session.modelMode,
|
|
94
|
-
...(runtime == null ? void 0 : runtime.title) ? { title: runtime.title } : {}
|
|
95
|
-
}
|
|
96
|
-
) }),
|
|
97
|
-
session.permissionMode ? /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "session-permission-mode", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
98
|
-
PermissionModeRow,
|
|
99
|
-
{
|
|
100
|
-
family: session.source,
|
|
101
|
-
mode: session.permissionMode
|
|
102
|
-
}
|
|
103
|
-
) }) : null,
|
|
104
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
105
|
-
DetailRow,
|
|
106
|
-
{
|
|
107
|
-
icon: UiServerProcess.UiServerProcess,
|
|
108
|
-
label: "PID",
|
|
109
|
-
value: (_a = session.live) == null ? void 0 : _a.pid
|
|
110
|
-
}
|
|
111
|
-
),
|
|
112
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
113
|
-
DetailRow,
|
|
114
|
-
{
|
|
115
|
-
icon: UiFingerprint.UiFingerprint,
|
|
116
|
-
label: "Session ID",
|
|
117
|
-
value: session.id,
|
|
118
|
-
mono: true
|
|
119
|
-
}
|
|
120
|
-
)
|
|
121
|
-
] })
|
|
122
|
-
] }),
|
|
123
|
-
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mt-density-5 rounded-lg border border-border bg-background p-density-3 shadow-sm", children: [
|
|
124
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-density-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: [
|
|
125
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCoins.UiCoins, size: "xs" }),
|
|
126
|
-
"Usage"
|
|
127
|
-
] }),
|
|
128
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-density-3 grid grid-cols-2 gap-density-3", children: [
|
|
129
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
130
|
-
UsageMetric,
|
|
131
|
-
{
|
|
132
|
-
label: "Tokens",
|
|
133
|
-
value: tokens$1 ? preciseTokens(tokens$1) : "-"
|
|
134
|
-
}
|
|
135
|
-
),
|
|
136
|
-
/* @__PURE__ */ jsxRuntime.jsx(UsageMetric, { label: "Cost", value: cost ? tokens.formatCost(cost) : "-" }),
|
|
137
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
138
|
-
UsageMetric,
|
|
139
|
-
{
|
|
140
|
-
label: "Input",
|
|
141
|
-
value: (usage == null ? void 0 : usage.inputTokens) ? tokens.compactTokens(usage.inputTokens) : "-"
|
|
142
|
-
}
|
|
143
|
-
),
|
|
144
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
145
|
-
UsageMetric,
|
|
146
|
-
{
|
|
147
|
-
label: "Output",
|
|
148
|
-
value: (usage == null ? void 0 : usage.outputTokens) ? tokens.compactTokens(usage.outputTokens) : "-"
|
|
149
|
-
}
|
|
150
|
-
)
|
|
151
|
-
] })
|
|
152
|
-
] })
|
|
153
|
-
] });
|
|
154
|
-
}
|
|
155
|
-
function PermissionModeRow({
|
|
156
|
-
family,
|
|
157
|
-
mode
|
|
158
|
-
}) {
|
|
159
|
-
const known = SpecRuntimeEditor_sandboxModel.SPEC_PERMISSION_MODES.find((candidate) => candidate === mode);
|
|
160
|
-
const visual = known ? permissionModeVisuals.permissionModeVisual(family, known) : void 0;
|
|
161
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
162
|
-
DetailRow,
|
|
163
|
-
{
|
|
164
|
-
icon: (visual == null ? void 0 : visual.icon) ?? UiShield.UiShield,
|
|
165
|
-
label: "Permission mode",
|
|
166
|
-
value: (visual == null ? void 0 : visual.label) ?? mode
|
|
167
|
-
}
|
|
168
|
-
);
|
|
169
|
-
}
|
|
170
|
-
function DetailRow({
|
|
171
|
-
icon,
|
|
172
|
-
label,
|
|
173
|
-
value,
|
|
174
|
-
title,
|
|
175
|
-
mono = false
|
|
176
|
-
}) {
|
|
177
|
-
if (value === void 0 || value === null || value === "") return null;
|
|
178
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1rem_minmax(0,1fr)] gap-x-density-2", children: [
|
|
179
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon, size: "xs", className: "mt-0.5 text-muted-foreground" }),
|
|
180
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
|
|
181
|
-
/* @__PURE__ */ jsxRuntime.jsx("dt", { className: "text-[11px] text-muted-foreground", children: label }),
|
|
182
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
183
|
-
"dd",
|
|
184
|
-
{
|
|
185
|
-
className: mono ? "truncate font-mono text-xs text-foreground" : "truncate text-sm text-foreground",
|
|
186
|
-
title,
|
|
187
|
-
children: value
|
|
188
|
-
}
|
|
189
|
-
)
|
|
190
|
-
] })
|
|
191
|
-
] });
|
|
192
|
-
}
|
|
193
|
-
function UsageMetric({ label, value }) {
|
|
194
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
195
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[11px] text-muted-foreground", children: label }),
|
|
196
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 text-sm font-semibold tabular-nums text-foreground", children: value })
|
|
197
|
-
] });
|
|
198
|
-
}
|
|
199
|
-
function preciseTokens(value) {
|
|
200
|
-
if (value >= 1e3 && value < 1e4 && value % 1e3 !== 0) {
|
|
201
|
-
return `${(value / 1e3).toFixed(1)}k`;
|
|
202
|
-
}
|
|
203
|
-
return tokens.compactTokens(value);
|
|
204
|
-
}
|
|
205
50
|
exports.SessionInspectorHeader = SessionInspectorHeader;
|
|
206
|
-
exports.SessionInspectorSidebar = SessionInspectorSidebar;
|
|
207
51
|
//# sourceMappingURL=SessionInspector.summary.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.summary.cjs","sources":["../../../src/data/ai/SessionInspector.summary.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport {\n UiClock,\n UiCoins,\n UiFingerprint,\n UiRobotAi,\n UiServerProcess,\n UiShield,\n UiTimer,\n} from \"../../icons\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { effortLevelLabel } from \"../chat/effort-icons\";\nimport { providerIcon, providerIconColor } from \"../chat/provider-icons\";\nimport { effortIcon } from \"./agent-action-icons\";\nimport {\n compactTokens,\n costTotal,\n formatCost,\n tokenTotal,\n} from \"./session-cost\";\nimport {\n durationLabel,\n formatDate,\n runtimeDescriptor,\n} from \"./SessionInspector.model\";\nimport { SessionContextMeter } from \"./SessionViewer.header\";\nimport { getSessionMetadata } from \"./SessionViewer.model\";\nimport type { UnifiedSessionInput } from \"./SessionViewer.unified\";\nimport { permissionModeVisual } from \"./SpecRuntimeEditor/permission-mode-visuals\";\nimport { SPEC_PERMISSION_MODES } from \"./SpecRuntimeEditor.model\";\n\nexport function SessionInspectorHeader({\n session,\n}: {\n session: UnifiedSessionInput;\n}) {\n const provider = runtimeDescriptor(session.modelMode);\n const providerId = session.provider || provider?.family;\n const ProviderIcon = providerIcon(providerId) ?? UiRobotAi;\n const providerColor = providerIconColor(providerId);\n const effortValue = session.reasoningEffort?.trim();\n const effort = effortValue ? effortIcon(effortValue) : undefined;\n const title =\n session.title?.trim() ||\n session.initialPrompt?.trim() ||\n session.model ||\n provider?.family ||\n session.provider ||\n \"Session\";\n const metadata = getSessionMetadata(session);\n const showMeter = Boolean(metadata?.context);\n\n return (\n <header className=\"shrink-0 border-b border-border bg-muted/20 px-density-2 py-density-3\">\n <div className=\"flex min-w-0 items-start gap-density-3\">\n {showMeter && metadata ? (\n <div className=\"-ml-1.5 shrink-0\">\n <SessionContextMeter metadata={metadata} mode=\"gauge\" />\n </div>\n ) : (\n <span className=\"mt-0.5 inline-flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-background text-foreground shadow-sm\">\n <Icon\n icon={ProviderIcon}\n size=\"md\"\n {...(providerColor ? { className: providerColor } : {})}\n />\n </span>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-density-2\">\n <h2 className=\"min-w-0 max-w-full truncate text-base font-semibold tracking-tight text-foreground\">\n {title}\n </h2>\n {effortValue ? (\n <span className=\"inline-flex shrink-0 items-center gap-1 rounded-full border border-border bg-background px-2 py-0.5 text-xs max-sm:basis-full max-sm:border-0 max-sm:bg-transparent max-sm:px-0\">\n {effort ? <Icon icon={effort.icon} size=\"xs\" /> : null}\n {effortLevelLabel(effortValue)}\n </span>\n ) : null}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-x-density-3 gap-y-1 text-xs text-muted-foreground\">\n {session.startedAt ? (\n <span className=\"inline-flex items-center gap-1\">\n <Icon icon={UiTimer} size=\"xs\" />\n {durationLabel(session.startedAt, session.endedAt)}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n </header>\n );\n}\n\nexport function SessionInspectorSidebar({\n session,\n}: {\n session: UnifiedSessionInput;\n}) {\n const runtime = runtimeDescriptor(session.modelMode);\n const RuntimeIcon = runtime?.icon ?? UiRobotAi;\n const usage = session.usage ?? session.cost;\n const tokens = tokenTotal(usage);\n const cost = costTotal(session.cost);\n\n return (\n <aside className=\"border-t border-border bg-muted/10 p-density-4 lg:min-h-0 lg:overflow-auto lg:border-l lg:border-t-0\">\n <section>\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Session details\n </h3>\n <dl className=\"mt-density-3 space-y-density-3\">\n <DetailRow\n icon={UiClock}\n label=\"Started\"\n value={formatDate(session.startedAt)}\n />\n <DetailRow\n icon={UiRobotAi}\n label=\"Connection\"\n value={session.provider || session.source}\n />\n <div data-testid=\"session-runtime-mode\">\n <DetailRow\n icon={RuntimeIcon}\n label=\"Mode\"\n value={runtime?.mode || session.modelMode}\n {...(runtime?.title ? { title: runtime.title } : {})}\n />\n </div>\n {session.permissionMode ? (\n <div data-testid=\"session-permission-mode\">\n <PermissionModeRow\n family={session.source}\n mode={session.permissionMode}\n />\n </div>\n ) : null}\n <DetailRow\n icon={UiServerProcess}\n label=\"PID\"\n value={session.live?.pid}\n />\n <DetailRow\n icon={UiFingerprint}\n label=\"Session ID\"\n value={session.id}\n mono\n />\n </dl>\n </section>\n\n <section className=\"mt-density-5 rounded-lg border border-border bg-background p-density-3 shadow-sm\">\n <div className=\"flex items-center gap-density-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n <Icon icon={UiCoins} size=\"xs\" />\n Usage\n </div>\n <div className=\"mt-density-3 grid grid-cols-2 gap-density-3\">\n <UsageMetric\n label=\"Tokens\"\n value={tokens ? preciseTokens(tokens) : \"-\"}\n />\n <UsageMetric label=\"Cost\" value={cost ? formatCost(cost) : \"-\"} />\n <UsageMetric\n label=\"Input\"\n value={usage?.inputTokens ? compactTokens(usage.inputTokens) : \"-\"}\n />\n <UsageMetric\n label=\"Output\"\n value={\n usage?.outputTokens ? compactTokens(usage.outputTokens) : \"-\"\n }\n />\n </div>\n </section>\n </aside>\n );\n}\n\nfunction PermissionModeRow({\n family,\n mode,\n}: {\n family: string | undefined;\n mode: string;\n}) {\n const known = SPEC_PERMISSION_MODES.find((candidate) => candidate === mode);\n const visual = known ? permissionModeVisual(family, known) : undefined;\n return (\n <DetailRow\n icon={visual?.icon ?? UiShield}\n label=\"Permission mode\"\n value={visual?.label ?? mode}\n />\n );\n}\n\nfunction DetailRow({\n icon,\n label,\n value,\n title,\n mono = false,\n}: {\n icon: StaticIconComponent;\n label: string;\n value: ReactNode;\n title?: string;\n mono?: boolean;\n}) {\n if (value === undefined || value === null || value === \"\") return null;\n return (\n <div className=\"grid grid-cols-[1rem_minmax(0,1fr)] gap-x-density-2\">\n <Icon icon={icon} size=\"xs\" className=\"mt-0.5 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <dt className=\"text-[11px] text-muted-foreground\">{label}</dt>\n <dd\n className={\n mono\n ? \"truncate font-mono text-xs text-foreground\"\n : \"truncate text-sm text-foreground\"\n }\n title={title}\n >\n {value}\n </dd>\n </div>\n </div>\n );\n}\n\nfunction UsageMetric({ label, value }: { label: string; value: ReactNode }) {\n return (\n <div>\n <div className=\"text-[11px] text-muted-foreground\">{label}</div>\n <div className=\"mt-0.5 text-sm font-semibold tabular-nums text-foreground\">\n {value}\n </div>\n </div>\n );\n}\n\nfunction preciseTokens(value: number) {\n if (value >= 1_000 && value < 10_000 && value % 1_000 !== 0) {\n return `${(value / 1_000).toFixed(1)}k`;\n }\n return compactTokens(value);\n}\n"],"names":["runtimeDescriptor","providerIcon","UiRobotAi","providerIconColor","effortIcon","getSessionMetadata","jsxs","jsx","SessionContextMeter","Icon","effortLevelLabel","UiTimer","durationLabel","tokens","tokenTotal","costTotal","UiClock","formatDate","UiServerProcess","UiFingerprint","UiCoins","formatCost","compactTokens","SPEC_PERMISSION_MODES","permissionModeVisual","UiShield"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionInspector.summary.cjs","sources":["../../../src/data/ai/SessionInspector.summary.tsx"],"sourcesContent":["import { UiRobotAi, UiTimer } from \"../../icons\";\nimport { Icon } from \"../Icon\";\nimport { effortLevelLabel } from \"../chat/effort-icons\";\nimport { providerIcon, providerIconColor } from \"../chat/provider-icons\";\nimport { effortIcon } from \"./agent-action-icons\";\nimport { durationLabel, runtimeDescriptor } from \"./SessionInspector.model\";\nimport { SessionContextMeter } from \"./SessionViewer.header\";\nimport { getSessionMetadata } from \"./SessionViewer.model\";\nimport type { UnifiedSessionInput } from \"./SessionViewer.unified\";\n\nexport function SessionInspectorHeader({\n session,\n}: {\n session: UnifiedSessionInput;\n}) {\n const provider = runtimeDescriptor(session.modelMode);\n const providerId = session.provider || provider?.family;\n const ProviderIcon = providerIcon(providerId) ?? UiRobotAi;\n const providerColor = providerIconColor(providerId);\n const effortValue = session.reasoningEffort?.trim();\n const effort = effortValue ? effortIcon(effortValue) : undefined;\n const title =\n session.title?.trim() ||\n session.initialPrompt?.trim() ||\n session.model ||\n provider?.family ||\n session.provider ||\n \"Session\";\n const metadata = getSessionMetadata(session);\n const showMeter = Boolean(metadata?.context);\n\n return (\n <header className=\"shrink-0 border-b border-border bg-muted/20 px-density-2 py-density-3\">\n <div className=\"flex min-w-0 items-start gap-density-3\">\n {showMeter && metadata ? (\n <div className=\"-ml-1.5 shrink-0\">\n <SessionContextMeter metadata={metadata} mode=\"gauge\" />\n </div>\n ) : (\n <span className=\"mt-0.5 inline-flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-background text-foreground shadow-sm\">\n <Icon\n icon={ProviderIcon}\n size=\"md\"\n {...(providerColor ? { className: providerColor } : {})}\n />\n </span>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-density-2\">\n <h2 className=\"min-w-0 max-w-full truncate text-base font-semibold tracking-tight text-foreground\">\n {title}\n </h2>\n {effortValue ? (\n <span className=\"inline-flex shrink-0 items-center gap-1 rounded-full border border-border bg-background px-2 py-0.5 text-xs max-sm:basis-full max-sm:border-0 max-sm:bg-transparent max-sm:px-0\">\n {effort ? <Icon icon={effort.icon} size=\"xs\" /> : null}\n {effortLevelLabel(effortValue)}\n </span>\n ) : null}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-x-density-3 gap-y-1 text-xs text-muted-foreground\">\n {session.startedAt ? (\n <span className=\"inline-flex items-center gap-1\">\n <Icon icon={UiTimer} size=\"xs\" />\n {durationLabel(session.startedAt, session.endedAt)}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n </header>\n );\n}\n"],"names":["runtimeDescriptor","providerIcon","UiRobotAi","providerIconColor","effortIcon","getSessionMetadata","jsxs","jsx","SessionContextMeter","Icon","effortLevelLabel","UiTimer","durationLabel"],"mappings":";;;;;;;;;;;;AAUO,SAAS,uBAAuB;AAAA,EACrC;AACF,GAEG;;AACD,QAAM,WAAWA,uBAAAA,kBAAkB,QAAQ,SAAS;AACpD,QAAM,aAAa,QAAQ,aAAY,qCAAU;AACjD,QAAM,eAAeC,cAAAA,aAAa,UAAU,KAAKC,UAAAA;AACjD,QAAM,gBAAgBC,cAAAA,kBAAkB,UAAU;AAClD,QAAM,eAAc,aAAQ,oBAAR,mBAAyB;AAC7C,QAAM,SAAS,cAAcC,4BAAW,WAAW,IAAI;AACvD,QAAM,UACJ,aAAQ,UAAR,mBAAe,aACf,aAAQ,kBAAR,mBAAuB,WACvB,QAAQ,UACR,qCAAU,WACV,QAAQ,YACR;AACF,QAAM,WAAWC,oBAAAA,mBAAmB,OAAO;AAC3C,QAAM,YAAY,QAAQ,qCAAU,OAAO;AAE3C,wCACG,UAAA,EAAO,WAAU,yEAChB,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,0CACZ,UAAA;AAAA,IAAA,aAAa,WACZC,2BAAAA,IAAC,OAAA,EAAI,WAAU,oBACb,UAAAA,2BAAAA,IAACC,0CAAA,EAAoB,UAAoB,MAAK,SAAQ,EAAA,CACxD,IAEAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,0IACd,UAAAA,2BAAAA;AAAAA,MAACE,KAAAA;AAAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,MAAK;AAAA,QACJ,GAAI,gBAAgB,EAAE,WAAW,kBAAkB,CAAA;AAAA,MAAC;AAAA,IAAA,GAEzD;AAAA,IAEFH,2BAAAA,KAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,6CACb,UAAA;AAAA,QAAAC,2BAAAA,IAAC,MAAA,EAAG,WAAU,sFACX,UAAA,OACH;AAAA,QACC,cACCD,2BAAAA,KAAC,QAAA,EAAK,WAAU,mLACb,UAAA;AAAA,UAAA,wCAAUG,KAAAA,MAAA,EAAK,MAAM,OAAO,MAAM,MAAK,MAAK,IAAK;AAAA,UACjDC,YAAAA,iBAAiB,WAAW;AAAA,QAAA,EAAA,CAC/B,IACE;AAAA,MAAA,GACN;AAAA,MACAH,2BAAAA,IAAC,SAAI,WAAU,0FACZ,kBAAQ,YACPD,2BAAAA,KAAC,QAAA,EAAK,WAAU,kCACd,UAAA;AAAA,QAAAC,2BAAAA,IAACE,KAAAA,MAAA,EAAK,MAAME,QAAAA,SAAS,MAAK,MAAK;AAAA,QAC9BC,uBAAAA,cAAc,QAAQ,WAAW,QAAQ,OAAO;AAAA,MAAA,EAAA,CACnD,IACE,KAAA,CACN;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;;"}
|
|
@@ -2,7 +2,4 @@ import { UnifiedSessionInput } from './SessionViewer.unified.js';
|
|
|
2
2
|
export declare function SessionInspectorHeader({ session, }: {
|
|
3
3
|
session: UnifiedSessionInput;
|
|
4
4
|
}): import("react").JSX.Element;
|
|
5
|
-
export declare function SessionInspectorSidebar({ session, }: {
|
|
6
|
-
session: UnifiedSessionInput;
|
|
7
|
-
}): import("react").JSX.Element;
|
|
8
5
|
//# sourceMappingURL=SessionInspector.summary.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.summary.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionInspector.summary.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SessionInspector.summary.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionInspector.summary.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,GACR,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;CAC9B,+BAyDA"}
|