@flanksource/clicky-ui 0.3.41 → 0.3.43
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/dist/ai.cjs +4 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +4 -0
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentCard.cjs +3 -1
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +4 -2
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentCardParts.cjs +16 -0
- package/dist/comments/CommentCardParts.cjs.map +1 -1
- package/dist/comments/CommentCardParts.d.ts +4 -1
- package/dist/comments/CommentCardParts.d.ts.map +1 -1
- package/dist/comments/CommentCardParts.js +16 -0
- package/dist/comments/CommentCardParts.js.map +1 -1
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +4 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/components/Combobox.cjs +54 -8
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +56 -10
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxMenu.cjs +139 -113
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts +3 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +139 -113
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ComboboxMenuTrigger.cjs +87 -0
- package/dist/components/ComboboxMenuTrigger.cjs.map +1 -0
- package/dist/components/ComboboxMenuTrigger.d.ts +23 -0
- package/dist/components/ComboboxMenuTrigger.d.ts.map +1 -0
- package/dist/components/ComboboxMenuTrigger.js +87 -0
- package/dist/components/ComboboxMenuTrigger.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +30 -7
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +30 -7
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/SegmentedControl.cjs +20 -3
- package/dist/components/SegmentedControl.cjs.map +1 -1
- package/dist/components/SegmentedControl.d.ts +11 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -1
- package/dist/components/SegmentedControl.js +21 -4
- package/dist/components/SegmentedControl.js.map +1 -1
- package/dist/components/combobox-types.d.ts +8 -0
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-debug-badge.cjs +108 -0
- package/dist/components/json-schema-form-debug-badge.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-badge.d.ts +10 -0
- package/dist/components/json-schema-form-debug-badge.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-badge.js +108 -0
- package/dist/components/json-schema-form-debug-badge.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts +20 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.js +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.cjs +13 -0
- package/dist/components/json-schema-form-debug-glyph.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts +6 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.js +13 -0
- package/dist/components/json-schema-form-debug-glyph.js.map +1 -0
- package/dist/components/json-schema-form-debug-groups.cjs +56 -0
- package/dist/components/json-schema-form-debug-groups.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-groups.d.ts +8 -0
- package/dist/components/json-schema-form-debug-groups.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-groups.js +56 -0
- package/dist/components/json-schema-form-debug-groups.js.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.cjs +159 -0
- package/dist/components/json-schema-form-debug-keywords.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts +6 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.js +159 -0
- package/dist/components/json-schema-form-debug-keywords.js.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.cjs +102 -0
- package/dist/components/json-schema-form-debug-listeners.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts +6 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.js +102 -0
- package/dist/components/json-schema-form-debug-listeners.js.map +1 -0
- package/dist/components/json-schema-form-debug.cjs +31 -0
- package/dist/components/json-schema-form-debug.cjs.map +1 -0
- package/dist/components/json-schema-form-debug.d.ts +11 -0
- package/dist/components/json-schema-form-debug.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug.js +31 -0
- package/dist/components/json-schema-form-debug.js.map +1 -0
- package/dist/components/json-schema-form-enum-choice.cjs +114 -0
- package/dist/components/json-schema-form-enum-choice.cjs.map +1 -0
- package/dist/components/json-schema-form-enum-choice.d.ts +14 -0
- package/dist/components/json-schema-form-enum-choice.d.ts.map +1 -0
- package/dist/components/json-schema-form-enum-choice.js +114 -0
- package/dist/components/json-schema-form-enum-choice.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +3 -93
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +1 -91
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-listeners.cjs +7 -1
- package/dist/components/json-schema-form-listeners.cjs.map +1 -1
- package/dist/components/json-schema-form-listeners.d.ts.map +1 -1
- package/dist/components/json-schema-form-listeners.js +7 -1
- package/dist/components/json-schema-form-listeners.js.map +1 -1
- package/dist/components/json-schema-form-preferences.cjs +1 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -1
- package/dist/components/json-schema-form-preferences.d.ts +1 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
- package/dist/components/json-schema-form-preferences.js +1 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +21 -5
- 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 +21 -5
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +1 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-tone.cjs +12 -0
- package/dist/components/json-schema-form-tone.cjs.map +1 -1
- package/dist/components/json-schema-form-tone.js +12 -0
- package/dist/components/json-schema-form-tone.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +1 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/data/GraphDiagram.cjs +125 -138
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +30 -23
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +128 -141
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramEdges.cjs +208 -0
- package/dist/data/GraphDiagramEdges.cjs.map +1 -0
- package/dist/data/GraphDiagramEdges.d.ts +40 -0
- package/dist/data/GraphDiagramEdges.d.ts.map +1 -0
- package/dist/data/GraphDiagramEdges.js +208 -0
- package/dist/data/GraphDiagramEdges.js.map +1 -0
- package/dist/data/GraphDiagramNodes.cjs +142 -0
- package/dist/data/GraphDiagramNodes.cjs.map +1 -0
- package/dist/data/GraphDiagramNodes.d.ts +22 -0
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -0
- package/dist/data/GraphDiagramNodes.js +142 -0
- package/dist/data/GraphDiagramNodes.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +37 -43
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +3 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +38 -44
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +16 -5
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts +4 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.js +17 -6
- package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.cjs +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.d.ts +11 -2
- package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.js +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +25 -1
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +26 -2
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionInspector.summary.cjs +9 -3
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.summary.js +9 -3
- package/dist/data/ai/SessionInspector.summary.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +4 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.js +4 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionViewer.approval-body.cjs +146 -0
- package/dist/data/ai/SessionViewer.approval-body.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts +11 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.js +146 -0
- package/dist/data/ai/SessionViewer.approval-body.js.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts +23 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.js +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +57 -20
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +13 -3
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.decision-controls.cjs +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts +43 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.js +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.js.map +1 -0
- package/dist/data/ai/SessionViewer.decision.cjs +21 -0
- package/dist/data/ai/SessionViewer.decision.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision.d.ts +12 -0
- package/dist/data/ai/SessionViewer.decision.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision.js +21 -0
- package/dist/data/ai/SessionViewer.decision.js.map +1 -0
- package/dist/data/ai/SessionViewer.input.cjs +14 -0
- package/dist/data/ai/SessionViewer.input.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.input.d.ts +5 -0
- package/dist/data/ai/SessionViewer.input.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.input.js +14 -0
- package/dist/data/ai/SessionViewer.input.js.map +1 -1
- package/dist/data/ai/SessionViewer.js +58 -21
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +4 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +6 -3
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +2 -1
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +6 -3
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.cjs +29 -237
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.js +27 -235
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.cjs +8 -2
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
- package/dist/data/ai/SessionViewerMenu.d.ts +4 -1
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.js +8 -2
- package/dist/data/ai/SessionViewerMenu.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +28 -17
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts +10 -2
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +29 -18
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +9 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +8 -2
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +1 -0
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/approval-request.cjs +75 -0
- package/dist/data/ai/approval-request.cjs.map +1 -0
- package/dist/data/ai/approval-request.d.ts +155 -0
- package/dist/data/ai/approval-request.d.ts.map +1 -0
- package/dist/data/ai/approval-request.js +75 -0
- package/dist/data/ai/approval-request.js.map +1 -0
- package/dist/data/ai/index.d.ts +3 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts +11 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts +3 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs +73 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts +13 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.js +73 -0
- package/dist/data/ai/runtime-preset-menu/model.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts +15 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js.map +1 -0
- package/dist/data/ai/runtime-spec-fields.cjs +166 -0
- package/dist/data/ai/runtime-spec-fields.cjs.map +1 -0
- package/dist/data/ai/runtime-spec-fields.d.ts +13 -0
- package/dist/data/ai/runtime-spec-fields.d.ts.map +1 -0
- package/dist/data/ai/runtime-spec-fields.js +166 -0
- package/dist/data/ai/runtime-spec-fields.js.map +1 -0
- package/dist/data/ai/session-categories.cjs +4 -0
- package/dist/data/ai/session-categories.cjs.map +1 -1
- package/dist/data/ai/session-categories.d.ts +1 -0
- package/dist/data/ai/session-categories.d.ts.map +1 -1
- package/dist/data/ai/session-categories.js +4 -0
- package/dist/data/ai/session-categories.js.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +49 -21
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +2 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +49 -21
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +1 -1
- package/dist/data/chat/Chat.runtime.cjs.map +1 -1
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
- package/dist/data/chat/Chat.runtime.js +1 -1
- package/dist/data/chat/Chat.runtime.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +216 -0
- package/dist/data/graph-columns-layout.cjs.map +1 -0
- package/dist/data/graph-columns-layout.d.ts +56 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -0
- package/dist/data/graph-columns-layout.js +216 -0
- package/dist/data/graph-columns-layout.js.map +1 -0
- package/dist/data/graph-diagram-model.cjs +73 -0
- package/dist/data/graph-diagram-model.cjs.map +1 -0
- package/dist/data/graph-diagram-model.d.ts +90 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -0
- package/dist/data/graph-diagram-model.js +73 -0
- package/dist/data/graph-diagram-model.js.map +1 -0
- package/dist/data/graph-edge-routing.cjs +235 -0
- package/dist/data/graph-edge-routing.cjs.map +1 -0
- package/dist/data/graph-edge-routing.d.ts +73 -0
- package/dist/data/graph-edge-routing.d.ts.map +1 -0
- package/dist/data/graph-edge-routing.js +235 -0
- package/dist/data/graph-edge-routing.js.map +1 -0
- package/dist/data/graph-layout.cjs +0 -82
- package/dist/data/graph-layout.cjs.map +1 -1
- package/dist/data/graph-layout.d.ts +1 -28
- package/dist/data/graph-layout.d.ts.map +1 -1
- package/dist/data/graph-layout.js +1 -83
- package/dist/data/graph-layout.js.map +1 -1
- package/dist/data/har/HarPanel.cjs +129 -33
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +13 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +130 -34
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/har/fixtures.d.ts +12 -0
- package/dist/data/har/fixtures.d.ts.map +1 -1
- package/dist/data/har/types.d.ts +12 -0
- package/dist/data/har/types.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +67 -84
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +4 -5
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.cjs +170 -0
- package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts +16 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.js +170 -0
- package/dist/data/runtime/RuntimeBar.fields.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.js +70 -87
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs +56 -0
- package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts +20 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.js +56 -0
- package/dist/data/runtime/RuntimeBar.selection.js.map +1 -0
- package/dist/data/runtime/RuntimeBarActions.cjs +10 -6
- package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts +8 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.js +10 -6
- package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.cjs +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts +25 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.js +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs +95 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts +9 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.js +95 -0
- package/dist/data/runtime/RuntimeBarLayout.js.map +1 -0
- package/dist/data/runtime/RuntimeBarSegment.cjs +25 -14
- package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.d.ts +4 -0
- package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.js +25 -14
- package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
- package/dist/data/runtime/RuntimeLimitInput.cjs +41 -0
- package/dist/data/runtime/RuntimeLimitInput.cjs.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts +9 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.js +41 -0
- package/dist/data/runtime/RuntimeLimitInput.js.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts +13 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -0
- package/dist/data/use-edge-focus.cjs +20 -0
- package/dist/data/use-edge-focus.cjs.map +1 -0
- package/dist/data/use-edge-focus.d.ts +23 -0
- package/dist/data/use-edge-focus.d.ts.map +1 -0
- package/dist/data/use-edge-focus.js +20 -0
- package/dist/data/use-edge-focus.js.map +1 -0
- package/dist/data/use-pan-zoom.cjs +159 -0
- package/dist/data/use-pan-zoom.cjs.map +1 -0
- package/dist/data/use-pan-zoom.d.ts +79 -0
- package/dist/data/use-pan-zoom.d.ts.map +1 -0
- package/dist/data/use-pan-zoom.js +159 -0
- package/dist/data/use-pan-zoom.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +5 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -3
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +6 -2
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +5 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +1 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +4 -0
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +1 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +31 -15
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +31 -15
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.cjs +5 -2
- package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.js +5 -2
- package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.cjs +2 -0
- package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.d.ts.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.js +2 -0
- package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.cjs +1 -0
- package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.d.ts +3 -0
- package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.js +1 -0
- package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +3 -1
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +3 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +3 -1
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/useOperationPages.cjs +6 -1
- package/dist/rpc/useOperationPages.cjs.map +1 -1
- package/dist/rpc/useOperationPages.d.ts +3 -1
- package/dist/rpc/useOperationPages.d.ts.map +1 -1
- package/dist/rpc/useOperationPages.js +6 -1
- package/dist/rpc/useOperationPages.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/schemas/json-schema-form.schema.json +5 -0
- package/dist/data/runtime/RuntimeBarCombo.cjs +0 -423
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +0 -33
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.js +0 -423
- package/dist/data/runtime/RuntimeBarCombo.js.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.cjs +0 -262
- package/dist/data/runtime/RuntimeBarLimits.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.d.ts +0 -17
- package/dist/data/runtime/RuntimeBarLimits.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.js +0 -262
- package/dist/data/runtime/RuntimeBarLimits.js.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +0 -346
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +0 -37
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.js +0 -346
- package/dist/data/runtime/RuntimeBarSegments.js.map +0 -1
|
@@ -13,6 +13,7 @@ const permissionsModel = require("../SpecRuntimeEditor/permissions-model.cjs");
|
|
|
13
13
|
const update = require("../SpecRuntimeEditor/update.cjs");
|
|
14
14
|
const runtimeFamily = require("../../../lib/runtime-family.cjs");
|
|
15
15
|
const SpecRuntimeEditor_sandboxModel = require("../SpecRuntimeEditor.sandbox-model.cjs");
|
|
16
|
+
const UiShield = require("../../../icons/components/UiShield.cjs");
|
|
16
17
|
const UiSliders = require("../../../icons/components/UiSliders.cjs");
|
|
17
18
|
const PERMISSION_GROUP = "Permission posture";
|
|
18
19
|
const PRESETS_GROUP = "Presets";
|
|
@@ -20,12 +21,14 @@ function permissionField({
|
|
|
20
21
|
spec,
|
|
21
22
|
families,
|
|
22
23
|
effectiveMode,
|
|
23
|
-
|
|
24
|
+
effectiveModel,
|
|
25
|
+
onChange,
|
|
26
|
+
models = []
|
|
24
27
|
}) {
|
|
25
28
|
var _a, _b;
|
|
26
29
|
const specMode = ((_a = spec.mode) == null ? void 0 : _a.trim()) || (effectiveMode == null ? void 0 : effectiveMode.trim());
|
|
27
|
-
const
|
|
28
|
-
const
|
|
30
|
+
const family = runtimeFamily.familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ?? (specMode ? runtimeMode.familyForMode(families, specMode) : void 0);
|
|
31
|
+
const runtime = specMode ? runtimeFamily.modeOptionFor(families, specMode, family == null ? void 0 : family.id) : void 0;
|
|
29
32
|
const available = permissionsModel.publishedPermissionModes(runtime == null ? void 0 : runtime.schema);
|
|
30
33
|
const published = SpecRuntimeEditor_sandboxModel.SPEC_PERMISSION_MODES.filter(
|
|
31
34
|
(mode) => available.includes(mode)
|
|
@@ -53,8 +56,10 @@ function permissionField({
|
|
|
53
56
|
const select = (mode) => onChange(update.withPermissionMode(spec, mode));
|
|
54
57
|
return {
|
|
55
58
|
id: "permissions.mode",
|
|
59
|
+
isSet: current !== void 0,
|
|
56
60
|
label: PERMISSION_GROUP,
|
|
57
|
-
|
|
61
|
+
icon: UiShield.UiShield,
|
|
62
|
+
iconClassName: "text-muted-foreground",
|
|
58
63
|
title: unpublished ? `${PERMISSION_GROUP} — ${currentVisual == null ? void 0 : currentVisual.label} is not available for ${runtimeLabel}` : `${PERMISSION_GROUP} — ${(currentVisual == null ? void 0 : currentVisual.label) ?? unspecified.UNSPECIFIED_NAME}`,
|
|
59
64
|
caption: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
60
65
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn(RuntimeBarSegment.SEGMENT_KEY_CLASS, "min-w-0 truncate"), children: "Perms" }),
|
|
@@ -109,6 +114,7 @@ function permissionField({
|
|
|
109
114
|
}
|
|
110
115
|
),
|
|
111
116
|
icon: visual.icon,
|
|
117
|
+
iconClassName: sessionTones.sessionTone(visual.tone).text,
|
|
112
118
|
onSelect: () => select(mode)
|
|
113
119
|
};
|
|
114
120
|
}),
|
|
@@ -125,6 +131,7 @@ function permissionField({
|
|
|
125
131
|
}
|
|
126
132
|
),
|
|
127
133
|
icon: permissionModeVisuals.permissionModeVisual(family == null ? void 0 : family.id, current).icon,
|
|
134
|
+
iconClassName: "text-destructive",
|
|
128
135
|
disabled: true,
|
|
129
136
|
onSelect: () => {
|
|
130
137
|
}
|
|
@@ -139,7 +146,10 @@ function presetsField({
|
|
|
139
146
|
onChange,
|
|
140
147
|
onReorder
|
|
141
148
|
}) {
|
|
142
|
-
const rows = value.map((ref) => ({
|
|
149
|
+
const rows = value.map((ref) => ({
|
|
150
|
+
ref,
|
|
151
|
+
preset: runtimeProfileModel.presetForRef(ref, presets)
|
|
152
|
+
}));
|
|
143
153
|
const names = rows.map(({ ref, preset }) => (preset == null ? void 0 : preset.name) ?? ref);
|
|
144
154
|
const missing = rows.some(({ preset }) => !preset);
|
|
145
155
|
const toggle = (preset) => {
|
|
@@ -153,6 +163,7 @@ function presetsField({
|
|
|
153
163
|
};
|
|
154
164
|
return {
|
|
155
165
|
id: "presets",
|
|
166
|
+
isSet: value.length > 0,
|
|
156
167
|
label: PRESETS_GROUP,
|
|
157
168
|
title: names.length > 0 ? `Presets — ${names.join(", ")}` : "Presets — none",
|
|
158
169
|
caption: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeActions.cjs","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n onChange,\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const runtime = specMode ? modeOptionFor(families, specMode) : undefined;\n const family = specMode ? familyForMode(families, specMode) : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : (specMode ?? \"the current runtime\");\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n label: PERMISSION_GROUP,\n ...(currentVisual?.icon ? { icon: currentVisual.icon } : {}),\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({ ref, preset: presetForRef(ref, presets) }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n label: PRESETS_GROUP,\n title: names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["modeOptionFor","familyForMode","publishedPermissionModes","SPEC_PERMISSION_MODES","_a","collapsePermissionModeAliases","permissionModeVisual","withPermissionMode","UNSPECIFIED_NAME","jsxs","Fragment","jsx","cn","SEGMENT_KEY_CLASS","Icon","sessionTone","SEGMENT_CAPTION_CLASS","UNSPECIFIED_LABEL","SegmentItemLabel","unspecifiedHint","presetForRef","UiSliders"],"mappings":";;;;;;;;;;;;;;;;AAmCA,MAAM,mBAAmB;AACzB,MAAM,gBAAgB;AAUf,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKiC;;AAC/B,QAAM,aAAW,UAAK,SAAL,mBAAW,YAAU,+CAAe;AACrD,QAAM,UAAU,WAAWA,cAAAA,cAAc,UAAU,QAAQ,IAAI;AAC/D,QAAM,SAAS,WAAWC,YAAAA,cAAc,UAAU,QAAQ,IAAI;AAC9D,QAAM,YAAYC,iBAAAA,yBAAyB,mCAAS,MAAM;AAC1D,QAAM,YAAYC,+BAAAA,sBAAsB;AAAA,IAAO,CAAC,SAC9C,UAAU,SAAS,IAAI;AAAA,EAAA;AAEzB,QAAM,WAAU,UAAK,gBAAL,mBAAkB;AAClC,QAAM,UAAU,OAAO;AAAA,IACrB,UAAU,IAAI,CAAC,SAAA;;AAAS;AAAA,QACtB;AAAA,UACAC,MAAA,mCAAS,gBAAT,gBAAAA,IAAsB,MAAM,UAAS,EAAE,MAAM,SAAA;AAAA,MAAkB;AAAA,KAChE;AAAA,EAAA;AAEH,QAAM,UAAUC,sBAAAA;AAAAA,IACd,iCAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAIF,QAAM,cAAc,YAAY,UAAa,CAAC,UAAU,SAAS,OAAO;AACxE,MAAI,QAAQ,WAAW,KAAK,CAAC,YAAa,QAAO;AAEjD,QAAM,eAAe,UACjB,IAAG,iCAAQ,UAAS,QAAQ,IAAI,QAAQ,KAAK,KAC5C,YAAY;AACjB,QAAM,gBAAgB,UAClBC,sBAAAA,qBAAqB,iCAAQ,IAAI,OAAO,IACxC;AACJ,QAAM,SAAS,CAAC,SACd,SAASC,OAAAA,mBAAmB,MAAM,IAAI,CAAC;AAEzC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,IAAI,+CAAe,QAAO,EAAE,MAAM,cAAc,KAAA,IAAS,CAAA;AAAA,IACzD,OAAO,cACH,GAAG,gBAAgB,MAAM,+CAAe,KAAK,yBAAyB,YAAY,KAClF,GAAG,gBAAgB,OAAM,+CAAe,UAASC,YAAAA,gBAAgB;AAAA,IACrE,SACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,MAAAC,+BAAC,UAAK,WAAWC,MAAAA,GAAGC,kBAAAA,mBAAmB,kBAAkB,GAAG,UAAA,SAAK;AAAA,MAChE,iBACCF,2BAAAA;AAAAA,QAACG,KAAAA;AAAAA,QAAA;AAAA,UACC,MAAM,cAAc;AAAA,UACpB,WAAWF,MAAAA;AAAAA,YACT;AAAA,YACA,cACI,qBACAG,aAAAA,YAAY,cAAc,IAAI,EAAE;AAAA,UAAA;AAAA,QACtC;AAAA,MAAA;AAAA,MAGJJ,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC,MAAAA;AAAAA,YACTI,kBAAAA;AAAAA,YACA;AAAA,YACA,eAAe;AAAA,UAAA;AAAA,UAGhB,0DAAe,UAASC,YAAAA;AAAAA,QAAA;AAAA,MAAA;AAAA,IAC3B,GACF;AAAA,IAEF,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,OACEN,2BAAAA;AAAAA,UAACO,kBAAAA;AAAAA,UAAA;AAAA,YACC,MAAMD,YAAAA;AAAAA,YACN,MAAME,YAAAA,gBAAA;AAAA,YACN,UAAU,YAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAG1B,UAAU,MAAM,OAAO,MAAS;AAAA,MAAA;AAAA,MAElC,GAAG,QAAQ,IAAI,CAAC,SAAS;;AACvB,cAAM,SAASb,sBAAAA,qBAAqB,iCAAQ,IAAI,IAAI;AACpD,cAAM,OAAO,QAAQ,IAAI;AACzB,eAAO;AAAA,UACL,OAAO;AAAA,UACP,OACEK,2BAAAA;AAAAA,YAACO,kBAAAA;AAAAA,YAAA;AAAA,cACC,MAAM,OAAO;AAAA,cACZ,KAAId,MAAA,6BAAM,YAAN,gBAAAA,IAAe,QAAO,EAAE,MAAM,KAAK,QAAQ,KAAA,IAAS,CAAA;AAAA,cACzD,UAAU,SAAS;AAAA,cACnB,SAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UAGX,MAAM,OAAO;AAAA,UACb,UAAU,MAAM,OAAO,IAAI;AAAA,QAAA;AAAA,MAE/B,CAAC;AAAA,MACD,GAAI,eAAe,UACf;AAAA,QACE;AAAA,UACE,OAAO;AAAA,UACP,OACEO,2BAAAA;AAAAA,YAACO,kBAAAA;AAAAA,YAAA;AAAA,cACC,MAAMZ,sBAAAA,qBAAqB,iCAAQ,IAAI,OAAO,EAAE;AAAA,cAChD,MAAM,qBAAqB,YAAY;AAAA,cACvC,UAAQ;AAAA,cACR,SAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UAGX,MAAMA,sBAAAA,qBAAqB,iCAAQ,IAAI,OAAO,EAAE;AAAA,UAChD,UAAU;AAAA,UACV,UAAU,MAAM;AAAA,UAAC;AAAA,QAAA;AAAA,MACnB,IAEF,CAAA;AAAA,IAAC;AAAA,EACP;AAEJ;AAOO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKqB;AACnB,QAAM,OAAO,MAAM,IAAI,CAAC,SAAS,EAAE,KAAK,QAAQc,oBAAAA,aAAa,KAAK,OAAO,EAAA,EAAI;AAC7E,QAAM,QAAQ,KAAK,IAAI,CAAC,EAAE,KAAK,cAAa,iCAAQ,SAAQ,GAAG;AAC/D,QAAM,UAAU,KAAK,KAAK,CAAC,EAAE,OAAA,MAAa,CAAC,MAAM;AAEjD,QAAM,SAAS,CAAC,WAA0B;AACxC,UAAM,QAAQ,KAAK,UAAU,CAAC;;AAAQ,wBAAI,WAAJ,mBAAY,QAAO,OAAO;AAAA,KAAE;AAGlE;AAAA,MACE,UAAU,KACN,CAAC,GAAG,OAAO,OAAO,EAAE,IACpB,MAAM,OAAO,CAAC,GAAG,cAAc,cAAc,KAAK;AAAA,IAAA;AAAA,EAE1D;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,MAAM,SAAS,IAAI,aAAa,MAAM,KAAK,IAAI,CAAC,KAAK;AAAA,IAC5D,SACEX,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,MAAAC,+BAAC,UAAK,WAAWC,MAAAA,GAAGC,kBAAAA,mBAAmB,kBAAkB,GAAG,UAAA,WAE5D;AAAA,MACAF,2BAAAA,IAAC,QAAA,EAAK,WAAWC,MAAAA,GAAGI,kBAAAA,uBAAuB,UAAU,GAClD,UAAA,MAAM,SAAS,IAAI,OAAO,MAAM,MAAM,IAAIC,8BAAA,CAC7C;AAAA,IAAA,GACF;AAAA,IAEF,OAAO;AAAA,MACL,GAAG,QAAQ,IAAI,CAAC,YAAY;AAAA,QAC1B,OAAO;AAAA,QACP,OACEN,2BAAAA;AAAAA,UAACO,kBAAAA;AAAAA,UAAA;AAAA,YACC,MAAM,OAAO;AAAA,YACZ,GAAI,OAAO,cAAc,EAAE,MAAM,OAAO,YAAA,IAAgB,CAAA;AAAA,YACzD,UAAU,KAAK,KAAK,CAAC;;AAAQ,gCAAI,WAAJ,mBAAY,QAAO,OAAO;AAAA,aAAE;AAAA,YACzD,SAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAGX,UAAU,MAAM,OAAO,MAAM;AAAA,MAAA,EAC7B;AAAA;AAAA;AAAA,MAGF,GAAI,MAAM,UAAU,KAAK,UACrB;AAAA,QACE;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAMG,UAAAA;AAAAA,UACN,UAAU;AAAA,QAAA;AAAA,MACZ,IAEF,CAAA;AAAA,IAAC;AAAA,EACP;AAEJ;;;"}
|
|
1
|
+
{"version":3,"file":"runtimeActions.cjs","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: UiShield,\n iconClassName: \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["familyForModel","familyForMode","modeOptionFor","publishedPermissionModes","SPEC_PERMISSION_MODES","_a","collapsePermissionModeAliases","permissionModeVisual","withPermissionMode","UiShield","UNSPECIFIED_NAME","jsxs","Fragment","jsx","cn","SEGMENT_KEY_CLASS","Icon","sessionTone","SEGMENT_CAPTION_CLASS","UNSPECIFIED_LABEL","SegmentItemLabel","unspecifiedHint","presetForRef","UiSliders"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RuntimeBarAction } from '../../runtime/RuntimeBarActions.js';
|
|
2
|
+
import { ChatModel } from '../../chat/types.js';
|
|
2
3
|
import { SpecRuntimeFamily } from '../../runtime/runtime-mode.js';
|
|
3
4
|
import { RuntimePreset } from '../runtime-profile.js';
|
|
4
5
|
import { AISpecRuntimeValue } from '../SpecRuntimeEditor.model.js';
|
|
@@ -10,11 +11,13 @@ import { AISpecRuntimeValue } from '../SpecRuntimeEditor.model.js';
|
|
|
10
11
|
* Undefined when the resolved runtime publishes no postures (schema
|
|
11
12
|
* `enum: null`) and the spec holds none either — there is nothing to edit.
|
|
12
13
|
*/
|
|
13
|
-
export declare function permissionField({ spec, families, effectiveMode, onChange, }: {
|
|
14
|
+
export declare function permissionField({ spec, families, effectiveMode, effectiveModel, onChange, models, }: {
|
|
14
15
|
spec: AISpecRuntimeValue;
|
|
15
16
|
families: SpecRuntimeFamily[];
|
|
16
17
|
effectiveMode?: string | undefined;
|
|
18
|
+
effectiveModel?: string | undefined;
|
|
17
19
|
onChange: (spec: AISpecRuntimeValue) => void;
|
|
20
|
+
models?: ChatModel[];
|
|
18
21
|
}): RuntimeBarAction | undefined;
|
|
19
22
|
/**
|
|
20
23
|
* Preset selection as a runtime-bar action. Toggling happens in the menu;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeActions.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"runtimeActions.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMlD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAOpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,4BAA4B,CAAC;AAWpC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,cAAc,EACd,QAAQ,EACR,MAAW,GACZ,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB,GAAG,gBAAgB,GAAG,SAAS,CA4H/B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE;IACD,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,GAAG,gBAAgB,CA8DnB"}
|
|
@@ -9,8 +9,9 @@ import { sessionTone } from "../session-tones.js";
|
|
|
9
9
|
import { collapsePermissionModeAliases, permissionModeVisual } from "../SpecRuntimeEditor/permission-mode-visuals.js";
|
|
10
10
|
import { publishedPermissionModes } from "../SpecRuntimeEditor/permissions-model.js";
|
|
11
11
|
import { withPermissionMode } from "../SpecRuntimeEditor/update.js";
|
|
12
|
-
import { modeOptionFor } from "../../../lib/runtime-family.js";
|
|
12
|
+
import { familyForModel, modeOptionFor } from "../../../lib/runtime-family.js";
|
|
13
13
|
import { SPEC_PERMISSION_MODES } from "../SpecRuntimeEditor.sandbox-model.js";
|
|
14
|
+
import { UiShield } from "../../../icons/components/UiShield.js";
|
|
14
15
|
import { UiSliders } from "../../../icons/components/UiSliders.js";
|
|
15
16
|
const PERMISSION_GROUP = "Permission posture";
|
|
16
17
|
const PRESETS_GROUP = "Presets";
|
|
@@ -18,12 +19,14 @@ function permissionField({
|
|
|
18
19
|
spec,
|
|
19
20
|
families,
|
|
20
21
|
effectiveMode,
|
|
21
|
-
|
|
22
|
+
effectiveModel,
|
|
23
|
+
onChange,
|
|
24
|
+
models = []
|
|
22
25
|
}) {
|
|
23
26
|
var _a, _b;
|
|
24
27
|
const specMode = ((_a = spec.mode) == null ? void 0 : _a.trim()) || (effectiveMode == null ? void 0 : effectiveMode.trim());
|
|
25
|
-
const
|
|
26
|
-
const
|
|
28
|
+
const family = familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ?? (specMode ? familyForMode(families, specMode) : void 0);
|
|
29
|
+
const runtime = specMode ? modeOptionFor(families, specMode, family == null ? void 0 : family.id) : void 0;
|
|
27
30
|
const available = publishedPermissionModes(runtime == null ? void 0 : runtime.schema);
|
|
28
31
|
const published = SPEC_PERMISSION_MODES.filter(
|
|
29
32
|
(mode) => available.includes(mode)
|
|
@@ -51,8 +54,10 @@ function permissionField({
|
|
|
51
54
|
const select = (mode) => onChange(withPermissionMode(spec, mode));
|
|
52
55
|
return {
|
|
53
56
|
id: "permissions.mode",
|
|
57
|
+
isSet: current !== void 0,
|
|
54
58
|
label: PERMISSION_GROUP,
|
|
55
|
-
|
|
59
|
+
icon: UiShield,
|
|
60
|
+
iconClassName: "text-muted-foreground",
|
|
56
61
|
title: unpublished ? `${PERMISSION_GROUP} — ${currentVisual == null ? void 0 : currentVisual.label} is not available for ${runtimeLabel}` : `${PERMISSION_GROUP} — ${(currentVisual == null ? void 0 : currentVisual.label) ?? UNSPECIFIED_NAME}`,
|
|
57
62
|
caption: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
58
63
|
/* @__PURE__ */ jsx("span", { className: cn(SEGMENT_KEY_CLASS, "min-w-0 truncate"), children: "Perms" }),
|
|
@@ -107,6 +112,7 @@ function permissionField({
|
|
|
107
112
|
}
|
|
108
113
|
),
|
|
109
114
|
icon: visual.icon,
|
|
115
|
+
iconClassName: sessionTone(visual.tone).text,
|
|
110
116
|
onSelect: () => select(mode)
|
|
111
117
|
};
|
|
112
118
|
}),
|
|
@@ -123,6 +129,7 @@ function permissionField({
|
|
|
123
129
|
}
|
|
124
130
|
),
|
|
125
131
|
icon: permissionModeVisual(family == null ? void 0 : family.id, current).icon,
|
|
132
|
+
iconClassName: "text-destructive",
|
|
126
133
|
disabled: true,
|
|
127
134
|
onSelect: () => {
|
|
128
135
|
}
|
|
@@ -137,7 +144,10 @@ function presetsField({
|
|
|
137
144
|
onChange,
|
|
138
145
|
onReorder
|
|
139
146
|
}) {
|
|
140
|
-
const rows = value.map((ref) => ({
|
|
147
|
+
const rows = value.map((ref) => ({
|
|
148
|
+
ref,
|
|
149
|
+
preset: presetForRef(ref, presets)
|
|
150
|
+
}));
|
|
141
151
|
const names = rows.map(({ ref, preset }) => (preset == null ? void 0 : preset.name) ?? ref);
|
|
142
152
|
const missing = rows.some(({ preset }) => !preset);
|
|
143
153
|
const toggle = (preset) => {
|
|
@@ -151,6 +161,7 @@ function presetsField({
|
|
|
151
161
|
};
|
|
152
162
|
return {
|
|
153
163
|
id: "presets",
|
|
164
|
+
isSet: value.length > 0,
|
|
154
165
|
label: PRESETS_GROUP,
|
|
155
166
|
title: names.length > 0 ? `Presets — ${names.join(", ")}` : "Presets — none",
|
|
156
167
|
caption: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeActions.js","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n onChange,\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const runtime = specMode ? modeOptionFor(families, specMode) : undefined;\n const family = specMode ? familyForMode(families, specMode) : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : (specMode ?? \"the current runtime\");\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n label: PERMISSION_GROUP,\n ...(currentVisual?.icon ? { icon: currentVisual.icon } : {}),\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({ ref, preset: presetForRef(ref, presets) }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n label: PRESETS_GROUP,\n title: names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtimeActions.js","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: UiShield,\n iconClassName: \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -5,5 +5,17 @@ function pendingApprovalRequests(requests) {
|
|
|
5
5
|
(request) => request.state === "pending" && request.kind === "tool_approval"
|
|
6
6
|
);
|
|
7
7
|
}
|
|
8
|
+
function decisionFields(decision) {
|
|
9
|
+
const { answers, interrupt, scope, grants, content } = decision;
|
|
10
|
+
const fields = {
|
|
11
|
+
...answers ? { answers } : {},
|
|
12
|
+
...interrupt ? { interrupt } : {},
|
|
13
|
+
...scope ? { scope } : {},
|
|
14
|
+
...grants ? { grants } : {},
|
|
15
|
+
...content ? { content } : {}
|
|
16
|
+
};
|
|
17
|
+
return Object.keys(fields).length > 0 ? fields : void 0;
|
|
18
|
+
}
|
|
19
|
+
exports.decisionFields = decisionFields;
|
|
8
20
|
exports.pendingApprovalRequests = pendingApprovalRequests;
|
|
9
21
|
//# sourceMappingURL=SessionInspector.approvals-model.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.approvals-model.cjs","sources":["../../../src/data/ai/SessionInspector.approvals-model.ts"],"sourcesContent":["import type { SessionApprovalRequest } from \"./SessionViewer.unified\";\n\n/** Approve or deny one pending approval. */\nexport type ApprovalResolveAction = \"approve\" | \"deny\";\n\n/** Resolves one `session.requests[]` row. Rejecting surfaces the server's\n * refusal text inline on that row (e.g. the prompt run is no longer\n * `waiting`) instead of leaving the Approve/Deny buttons silently inert. */\nexport type ApprovalResolveHandler = (\n approvalId: string,\n action: ApprovalResolveAction,\n message?: string,\n) => void | Promise<void>;\n\n/** The subset of `session.requests[]` the approvals panel surfaces: outstanding\n * tool approvals, regardless of which surface (in-process chat or an external\n * broker) created the request.\n *\n * It lives here rather than beside the panel because it is a selector, not a\n * component, and a module that exports both loses fast refresh for everything\n * in it. Its other caller — the SessionInspector tab badge — only ever wanted\n * the count anyway. */\nexport function pendingApprovalRequests(\n requests: SessionApprovalRequest[] | undefined,\n): SessionApprovalRequest[] {\n return (requests ?? []).filter(\n (request) => request.state === \"pending\" && request.kind === \"tool_approval\",\n );\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"SessionInspector.approvals-model.cjs","sources":["../../../src/data/ai/SessionInspector.approvals-model.ts"],"sourcesContent":["import type { ApprovalDecisionFields } from \"./approval-request\";\nimport type { SessionApprovalRequest } from \"./SessionViewer.unified\";\n\n/** Approve or deny one pending approval. */\nexport type ApprovalResolveAction = \"approve\" | \"deny\";\n\n/** Resolves one `session.requests[]` row. Rejecting surfaces the server's\n * refusal text inline on that row (e.g. the prompt run is no longer\n * `waiting`) instead of leaving the Approve/Deny buttons silently inert.\n *\n * `decision` is passed only for a typed approval that sent more than\n * approve/deny + message: answers, form content, grants, scope, or interrupt\n * (Cancel is `deny` with `interrupt`). A plain approval calls it with three\n * arguments, exactly as before typed approvals existed. */\nexport type ApprovalResolveHandler = (\n approvalId: string,\n action: ApprovalResolveAction,\n message?: string,\n decision?: ApprovalDecisionFields,\n) => void | Promise<void>;\n\n/** The subset of `session.requests[]` the approvals panel surfaces: outstanding\n * tool approvals, regardless of which surface (in-process chat or an external\n * broker) created the request.\n *\n * It lives here rather than beside the panel because it is a selector, not a\n * component, and a module that exports both loses fast refresh for everything\n * in it. Its other caller — the SessionInspector tab badge — only ever wanted\n * the count anyway. */\nexport function pendingApprovalRequests(\n requests: SessionApprovalRequest[] | undefined,\n): SessionApprovalRequest[] {\n return (requests ?? []).filter(\n (request) => request.state === \"pending\" && request.kind === \"tool_approval\",\n );\n}\n\n/** The typed-decision fields a decision actually set, or undefined when it is a\n * plain approve/deny. */\nexport function decisionFields(\n decision: ApprovalDecisionFields,\n): ApprovalDecisionFields | undefined {\n const { answers, interrupt, scope, grants, content } = decision;\n const fields: ApprovalDecisionFields = {\n ...(answers ? { answers } : {}),\n ...(interrupt ? { interrupt } : {}),\n ...(scope ? { scope } : {}),\n ...(grants ? { grants } : {}),\n ...(content ? { content } : {}),\n };\n return Object.keys(fields).length > 0 ? fields : undefined;\n}\n"],"names":[],"mappings":";;AA6BO,SAAS,wBACd,UAC0B;AAC1B,UAAQ,YAAY,CAAA,GAAI;AAAA,IACtB,CAAC,YAAY,QAAQ,UAAU,aAAa,QAAQ,SAAS;AAAA,EAAA;AAEjE;AAIO,SAAS,eACd,UACoC;AACpC,QAAM,EAAE,SAAS,WAAW,OAAO,QAAQ,YAAY;AACvD,QAAM,SAAiC;AAAA,IACrC,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,IAC5B,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,IAChC,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,IACxB,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,IAC1B,GAAI,UAAU,EAAE,YAAY,CAAA;AAAA,EAAC;AAE/B,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;;;"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
import { ApprovalDecisionFields } from './approval-request.js';
|
|
1
2
|
import { SessionApprovalRequest } from './SessionViewer.unified.js';
|
|
2
3
|
/** Approve or deny one pending approval. */
|
|
3
4
|
export type ApprovalResolveAction = "approve" | "deny";
|
|
4
5
|
/** Resolves one `session.requests[]` row. Rejecting surfaces the server's
|
|
5
6
|
* refusal text inline on that row (e.g. the prompt run is no longer
|
|
6
|
-
* `waiting`) instead of leaving the Approve/Deny buttons silently inert.
|
|
7
|
-
|
|
7
|
+
* `waiting`) instead of leaving the Approve/Deny buttons silently inert.
|
|
8
|
+
*
|
|
9
|
+
* `decision` is passed only for a typed approval that sent more than
|
|
10
|
+
* approve/deny + message: answers, form content, grants, scope, or interrupt
|
|
11
|
+
* (Cancel is `deny` with `interrupt`). A plain approval calls it with three
|
|
12
|
+
* arguments, exactly as before typed approvals existed. */
|
|
13
|
+
export type ApprovalResolveHandler = (approvalId: string, action: ApprovalResolveAction, message?: string, decision?: ApprovalDecisionFields) => void | Promise<void>;
|
|
8
14
|
/** The subset of `session.requests[]` the approvals panel surfaces: outstanding
|
|
9
15
|
* tool approvals, regardless of which surface (in-process chat or an external
|
|
10
16
|
* broker) created the request.
|
|
@@ -14,4 +20,7 @@ export type ApprovalResolveHandler = (approvalId: string, action: ApprovalResolv
|
|
|
14
20
|
* in it. Its other caller — the SessionInspector tab badge — only ever wanted
|
|
15
21
|
* the count anyway. */
|
|
16
22
|
export declare function pendingApprovalRequests(requests: SessionApprovalRequest[] | undefined): SessionApprovalRequest[];
|
|
23
|
+
/** The typed-decision fields a decision actually set, or undefined when it is a
|
|
24
|
+
* plain approve/deny. */
|
|
25
|
+
export declare function decisionFields(decision: ApprovalDecisionFields): ApprovalDecisionFields | undefined;
|
|
17
26
|
//# sourceMappingURL=SessionInspector.approvals-model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.approvals-model.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionInspector.approvals-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,4CAA4C;AAC5C,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvD
|
|
1
|
+
{"version":3,"file":"SessionInspector.approvals-model.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionInspector.approvals-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,4CAA4C;AAC5C,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvD;;;;;;;4DAO4D;AAC5D,MAAM,MAAM,sBAAsB,GAAG,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,qBAAqB,EAC7B,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,sBAAsB,KAC9B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;;;;wBAOwB;AACxB,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,sBAAsB,EAAE,GAAG,SAAS,GAC7C,sBAAsB,EAAE,CAI1B;AAED;0BAC0B;AAC1B,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,sBAAsB,GAC/B,sBAAsB,GAAG,SAAS,CAUpC"}
|
|
@@ -3,7 +3,19 @@ function pendingApprovalRequests(requests) {
|
|
|
3
3
|
(request) => request.state === "pending" && request.kind === "tool_approval"
|
|
4
4
|
);
|
|
5
5
|
}
|
|
6
|
+
function decisionFields(decision) {
|
|
7
|
+
const { answers, interrupt, scope, grants, content } = decision;
|
|
8
|
+
const fields = {
|
|
9
|
+
...answers ? { answers } : {},
|
|
10
|
+
...interrupt ? { interrupt } : {},
|
|
11
|
+
...scope ? { scope } : {},
|
|
12
|
+
...grants ? { grants } : {},
|
|
13
|
+
...content ? { content } : {}
|
|
14
|
+
};
|
|
15
|
+
return Object.keys(fields).length > 0 ? fields : void 0;
|
|
16
|
+
}
|
|
6
17
|
export {
|
|
18
|
+
decisionFields,
|
|
7
19
|
pendingApprovalRequests
|
|
8
20
|
};
|
|
9
21
|
//# sourceMappingURL=SessionInspector.approvals-model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.approvals-model.js","sources":["../../../src/data/ai/SessionInspector.approvals-model.ts"],"sourcesContent":["import type { SessionApprovalRequest } from \"./SessionViewer.unified\";\n\n/** Approve or deny one pending approval. */\nexport type ApprovalResolveAction = \"approve\" | \"deny\";\n\n/** Resolves one `session.requests[]` row. Rejecting surfaces the server's\n * refusal text inline on that row (e.g. the prompt run is no longer\n * `waiting`) instead of leaving the Approve/Deny buttons silently inert. */\nexport type ApprovalResolveHandler = (\n approvalId: string,\n action: ApprovalResolveAction,\n message?: string,\n) => void | Promise<void>;\n\n/** The subset of `session.requests[]` the approvals panel surfaces: outstanding\n * tool approvals, regardless of which surface (in-process chat or an external\n * broker) created the request.\n *\n * It lives here rather than beside the panel because it is a selector, not a\n * component, and a module that exports both loses fast refresh for everything\n * in it. Its other caller — the SessionInspector tab badge — only ever wanted\n * the count anyway. */\nexport function pendingApprovalRequests(\n requests: SessionApprovalRequest[] | undefined,\n): SessionApprovalRequest[] {\n return (requests ?? []).filter(\n (request) => request.state === \"pending\" && request.kind === \"tool_approval\",\n );\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SessionInspector.approvals-model.js","sources":["../../../src/data/ai/SessionInspector.approvals-model.ts"],"sourcesContent":["import type { ApprovalDecisionFields } from \"./approval-request\";\nimport type { SessionApprovalRequest } from \"./SessionViewer.unified\";\n\n/** Approve or deny one pending approval. */\nexport type ApprovalResolveAction = \"approve\" | \"deny\";\n\n/** Resolves one `session.requests[]` row. Rejecting surfaces the server's\n * refusal text inline on that row (e.g. the prompt run is no longer\n * `waiting`) instead of leaving the Approve/Deny buttons silently inert.\n *\n * `decision` is passed only for a typed approval that sent more than\n * approve/deny + message: answers, form content, grants, scope, or interrupt\n * (Cancel is `deny` with `interrupt`). A plain approval calls it with three\n * arguments, exactly as before typed approvals existed. */\nexport type ApprovalResolveHandler = (\n approvalId: string,\n action: ApprovalResolveAction,\n message?: string,\n decision?: ApprovalDecisionFields,\n) => void | Promise<void>;\n\n/** The subset of `session.requests[]` the approvals panel surfaces: outstanding\n * tool approvals, regardless of which surface (in-process chat or an external\n * broker) created the request.\n *\n * It lives here rather than beside the panel because it is a selector, not a\n * component, and a module that exports both loses fast refresh for everything\n * in it. Its other caller — the SessionInspector tab badge — only ever wanted\n * the count anyway. */\nexport function pendingApprovalRequests(\n requests: SessionApprovalRequest[] | undefined,\n): SessionApprovalRequest[] {\n return (requests ?? []).filter(\n (request) => request.state === \"pending\" && request.kind === \"tool_approval\",\n );\n}\n\n/** The typed-decision fields a decision actually set, or undefined when it is a\n * plain approve/deny. */\nexport function decisionFields(\n decision: ApprovalDecisionFields,\n): ApprovalDecisionFields | undefined {\n const { answers, interrupt, scope, grants, content } = decision;\n const fields: ApprovalDecisionFields = {\n ...(answers ? { answers } : {}),\n ...(interrupt ? { interrupt } : {}),\n ...(scope ? { scope } : {}),\n ...(grants ? { grants } : {}),\n ...(content ? { content } : {}),\n };\n return Object.keys(fields).length > 0 ? fields : undefined;\n}\n"],"names":[],"mappings":"AA6BO,SAAS,wBACd,UAC0B;AAC1B,UAAQ,YAAY,CAAA,GAAI;AAAA,IACtB,CAAC,YAAY,QAAQ,UAAU,aAAa,QAAQ,SAAS;AAAA,EAAA;AAEjE;AAIO,SAAS,eACd,UACoC;AACpC,QAAM,EAAE,SAAS,WAAW,OAAO,QAAQ,YAAY;AACvD,QAAM,SAAiC;AAAA,IACrC,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,IAC5B,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,IAChC,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,IACxB,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,IAC1B,GAAI,UAAU,EAAE,YAAY,CAAA;AAAA,EAAC;AAE/B,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;"}
|
|
@@ -9,6 +9,7 @@ const SessionInspector_model = require("./SessionInspector.model.cjs");
|
|
|
9
9
|
const SessionInspector_panelParts = require("./SessionInspector.panel-parts.cjs");
|
|
10
10
|
const SessionInspector_panelValues = require("./SessionInspector.panel-values.cjs");
|
|
11
11
|
const SessionInspector_approvalsModel = require("./SessionInspector.approvals-model.cjs");
|
|
12
|
+
const SessionViewer_approvalBody = require("./SessionViewer.approval-body.cjs");
|
|
12
13
|
const UiClock = require("../../icons/components/UiClock.cjs");
|
|
13
14
|
function SessionApprovalsPanel({
|
|
14
15
|
approvals,
|
|
@@ -97,6 +98,11 @@ function PendingApprovalRow({
|
|
|
97
98
|
input: request.input,
|
|
98
99
|
approval: { id: request.id }
|
|
99
100
|
};
|
|
101
|
+
const typed = request.request;
|
|
102
|
+
const decideTyped = onResolve ? async (decision) => {
|
|
103
|
+
const fields = SessionInspector_approvalsModel.decisionFields(decision);
|
|
104
|
+
await (fields ? onResolve(request.id, decision.allow ? "approve" : "deny", decision.message, fields) : onResolve(request.id, decision.allow ? "approve" : "deny", decision.message));
|
|
105
|
+
} : void 0;
|
|
100
106
|
const handleApprove = (approvalId, approved, reason) => {
|
|
101
107
|
if (!onResolve) return;
|
|
102
108
|
setError(void 0);
|
|
@@ -116,7 +122,25 @@ function PendingApprovalRow({
|
|
|
116
122
|
request.expiresAt ? /* @__PURE__ */ jsxRuntime.jsx("span", { title: SessionInspector_model.formatDate(request.expiresAt), children: remainingLabel(request.expiresAt) }) : null
|
|
117
123
|
] })
|
|
118
124
|
] }),
|
|
119
|
-
/* @__PURE__ */ jsxRuntime.
|
|
125
|
+
typed ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "not-prose", children: [
|
|
126
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium text-foreground", children: request.tool }),
|
|
127
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
128
|
+
SessionViewer_approvalBody.TypedApprovalBody,
|
|
129
|
+
{
|
|
130
|
+
event: {
|
|
131
|
+
id: request.id,
|
|
132
|
+
kind: "tool",
|
|
133
|
+
tool: request.tool,
|
|
134
|
+
pending: true,
|
|
135
|
+
approvalId: request.id,
|
|
136
|
+
approvalKind: typed.kind,
|
|
137
|
+
approvalRequest: typed
|
|
138
|
+
},
|
|
139
|
+
request: typed,
|
|
140
|
+
onDecision: decideTyped
|
|
141
|
+
}
|
|
142
|
+
)
|
|
143
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
120
144
|
ToolCall.ToolCall,
|
|
121
145
|
{
|
|
122
146
|
part,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.approvals.cjs","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n setBusy(true);\n void Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => setBusy(false));\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n <ToolCall\n part={part}\n defaultOpen\n onApprove={busy ? undefined : handleApprove}\n />\n {busy ? (\n <p className=\"mt-1.5 pl-4 text-xs text-muted-foreground\">\n Submitting…\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":["pendingApprovalRequests","jsx","EmptyState","jsxs","KeyValueList","kv","SimpleList","Icon","UiClock","useState","formatDate","ToolCall","durationLabel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionInspector.approvals.cjs","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n decisionFields,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport { TypedApprovalBody } from \"./SessionViewer.approval-body\";\nimport type { DecisionHandler } from \"./SessionViewer.decision\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const typed = request.request;\n const decideTyped: DecisionHandler | undefined = onResolve\n ? async (decision) => {\n const fields = decisionFields(decision);\n await (fields\n ? onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message, fields)\n : onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message));\n }\n : undefined;\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n setBusy(true);\n void Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => setBusy(false));\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n {typed ? (\n <div className=\"not-prose\">\n <div className=\"font-medium text-foreground\">{request.tool}</div>\n <TypedApprovalBody\n event={{\n id: request.id,\n kind: \"tool\",\n tool: request.tool,\n pending: true,\n approvalId: request.id,\n approvalKind: typed.kind,\n approvalRequest: typed,\n }}\n request={typed}\n onDecision={decideTyped}\n />\n </div>\n ) : (\n <ToolCall\n part={part}\n defaultOpen\n onApprove={busy ? undefined : handleApprove}\n />\n )}\n {busy ? (\n <p className=\"mt-1.5 pl-4 text-xs text-muted-foreground\">\n Submitting…\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":["pendingApprovalRequests","jsx","EmptyState","jsxs","KeyValueList","kv","SimpleList","Icon","UiClock","useState","decisionFields","formatDate","TypedApprovalBody","ToolCall","durationLabel"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.approvals.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,sBAAsB,
|
|
1
|
+
{"version":3,"file":"SessionInspector.approvals.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,sBAAsB,EAG5B,MAAM,oCAAoC,CAAC;AAG5C,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C;;;iDAGiD;AACjD,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE;IACD,SAAS,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,EAAE,sBAAsB,EAAE,GAAG,SAAS,CAAC;IAChD,SAAS,CAAC,EAAE,sBAAsB,CAAC;CACpC,+BA4BA"}
|
|
@@ -6,7 +6,8 @@ import { ToolCall } from "../chat/ToolCall.js";
|
|
|
6
6
|
import { formatDate, durationLabel } from "./SessionInspector.model.js";
|
|
7
7
|
import { EmptyState, SimpleList } from "./SessionInspector.panel-parts.js";
|
|
8
8
|
import { kv } from "./SessionInspector.panel-values.js";
|
|
9
|
-
import { pendingApprovalRequests } from "./SessionInspector.approvals-model.js";
|
|
9
|
+
import { pendingApprovalRequests, decisionFields } from "./SessionInspector.approvals-model.js";
|
|
10
|
+
import { TypedApprovalBody } from "./SessionViewer.approval-body.js";
|
|
10
11
|
import { UiClock } from "../../icons/components/UiClock.js";
|
|
11
12
|
function SessionApprovalsPanel({
|
|
12
13
|
approvals,
|
|
@@ -95,6 +96,11 @@ function PendingApprovalRow({
|
|
|
95
96
|
input: request.input,
|
|
96
97
|
approval: { id: request.id }
|
|
97
98
|
};
|
|
99
|
+
const typed = request.request;
|
|
100
|
+
const decideTyped = onResolve ? async (decision) => {
|
|
101
|
+
const fields = decisionFields(decision);
|
|
102
|
+
await (fields ? onResolve(request.id, decision.allow ? "approve" : "deny", decision.message, fields) : onResolve(request.id, decision.allow ? "approve" : "deny", decision.message));
|
|
103
|
+
} : void 0;
|
|
98
104
|
const handleApprove = (approvalId, approved, reason) => {
|
|
99
105
|
if (!onResolve) return;
|
|
100
106
|
setError(void 0);
|
|
@@ -114,7 +120,25 @@ function PendingApprovalRow({
|
|
|
114
120
|
request.expiresAt ? /* @__PURE__ */ jsx("span", { title: formatDate(request.expiresAt), children: remainingLabel(request.expiresAt) }) : null
|
|
115
121
|
] })
|
|
116
122
|
] }),
|
|
117
|
-
/* @__PURE__ */
|
|
123
|
+
typed ? /* @__PURE__ */ jsxs("div", { className: "not-prose", children: [
|
|
124
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium text-foreground", children: request.tool }),
|
|
125
|
+
/* @__PURE__ */ jsx(
|
|
126
|
+
TypedApprovalBody,
|
|
127
|
+
{
|
|
128
|
+
event: {
|
|
129
|
+
id: request.id,
|
|
130
|
+
kind: "tool",
|
|
131
|
+
tool: request.tool,
|
|
132
|
+
pending: true,
|
|
133
|
+
approvalId: request.id,
|
|
134
|
+
approvalKind: typed.kind,
|
|
135
|
+
approvalRequest: typed
|
|
136
|
+
},
|
|
137
|
+
request: typed,
|
|
138
|
+
onDecision: decideTyped
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
] }) : /* @__PURE__ */ jsx(
|
|
118
142
|
ToolCall,
|
|
119
143
|
{
|
|
120
144
|
part,
|