@flanksource/clicky-ui 0.3.41 → 0.3.42
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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, type ReactNode } from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type { FixtureFenceSchemas } from \"../../FixtureEditor/types\";\nimport type {\n AISpecRuntimePermissionCatalog,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport type { SpecRuntimeSandboxCreateConfig } from \"../SandboxCreateWizard.model\";\nimport { CLIArgsSection, type SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nimport { CommitSection } from \"./CommitSection\";\nimport { EnvironmentAdvanced, EnvironmentSection } from \"./EnvironmentSection\";\nimport { Footer } from \"./Footer\";\nimport { ModelContextAdvanced } from \"./ModelContextAdvanced\";\nimport { ModelAdvanced, ModelSection } from \"./ModelSection\";\nimport { PermissionsAdvanced, PermissionsSection } from \"./PermissionsSection\";\nimport { PromptAdvanced, PromptSection } from \"./PromptSection\";\nimport { Rail } from \"./Rail\";\nimport { SandboxSection } from \"./SandboxSection\";\nimport { SectionCard } from \"./SectionCard\";\nimport { SectionTabs } from \"./SectionTabs\";\nimport { VerifySection } from \"./VerifySection\";\nimport { WorkspaceSection } from \"./WorkspaceSection\";\nimport {\n buildPermissionCatalog,\n specPermissionEntries,\n withAddedPermission,\n withPermissionEntries,\n} from \"./permissions-model\";\nimport { summarizeTarget } from \"./summaries\";\nimport {\n SPEC_RUNTIME_SECTIONS,\n type SpecRuntimeSandboxCatalog,\n type SpecRuntimeHostField,\n type SpecRuntimeSecretSelectorConfig,\n type SpecRuntimeTab,\n type SpecSectionId,\n type SpecSectionMeta,\n} from \"./types\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n firstMode,\n runtimeModeError,\n runtimeModeFromModel,\n runtimeModelError,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport { familyForModel } from \"../../../lib/runtime-family\";\nimport {\n runtimeFieldSection,\n runtimeFieldSupport,\n runtimeSchemaPropertyAtPath,\n SUPPORT_ALL_RUNTIME_FIELDS,\n} from \"../../runtime/runtime-field-support\";\nimport { useScrollSpy } from \"./use-scrollspy\";\n\nexport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nexport type {\n SpecRuntimeSandboxAgent,\n SpecRuntimeSandboxBackend,\n SpecRuntimeSandboxCatalog,\n SpecRuntimeSandboxKind,\n SpecRuntimeHostField,\n SpecRuntimeSecretSelectorConfig,\n SpecRuntimeTab,\n} from \"./types\";\nexport type { SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nexport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"../../runtime/runtime-mode\";\n\nexport type SpecRuntimeEditorProps = {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n /** Provider families for the two-axis Family → Mode picker in the model section. */\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode used to validate posture when this editable layer inherits it. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family. */\n effectiveModel?: string | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n /** Schema for the runtime's extra CLI args; enables the CLI flags section. */\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Runner schemas keyed by fixture kind or fence info, used by the verification editor. */\n fixtureSchemas?: FixtureFenceSchemas | undefined;\n /** Sandbox adapter catalog; enables the Sandbox section. */\n sandboxCatalog?: SpecRuntimeSandboxCatalog | undefined;\n /** Host-owned sandbox creation and credential-reference adapter. */\n sandboxCreate?: SpecRuntimeSandboxCreateConfig | undefined;\n /** Optional ordered section selection for embedded editors that only need part of the runtime spec. */\n sections?: readonly SpecSectionId[] | undefined;\n /** Groups sections behind a tab strip instead of stacking them; exclusive with `sections`. */\n tabs?: readonly SpecRuntimeTab[] | undefined;\n /** Controlled active tab id; falls back to the first visible tab when filtered out. */\n activeTab?: string | undefined;\n onActiveTabChange?: ((id: string) => void) | undefined;\n /** Model fields the host renders beside the editor; the Model section omits them. */\n hostFields?: readonly SpecRuntimeHostField[] | undefined;\n /**\n * `document` presents prompt.user as a complete .prompt body; `system` omits\n * prompt.user for hosts that edit it in their own composer.\n */\n promptVariant?: \"runtime\" | \"document\" | \"system\" | undefined;\n /** Disables value controls while preserving section navigation and disclosures. */\n readOnly?: boolean | undefined;\n className?: string | undefined;\n title?: ReactNode | undefined;\n eyebrow?: ReactNode | undefined;\n /** Hide the editor rail when a host modal already supplies the context. */\n showHeader?: boolean | undefined;\n /** Content rendered before the first section inside the editor column. */\n beforeSections?: ReactNode | undefined;\n /** Sections that should start collapsed in embedded contexts. */\n defaultCollapsedSections?: readonly SpecSectionId[] | undefined;\n /** Restrict task-owned fields when editing a reusable preset fragment. */\n variant?: \"run\" | \"preset\" | undefined;\n /** Renders the sticky footer's save action when set. */\n onSave?: (() => void) | undefined;\n /** Renders the sticky footer's cancel action when set. */\n onCancel?: (() => void) | undefined;\n saveLabel?: string | undefined;\n footerStatus?: ReactNode | undefined;\n};\n\nconst ADVANCED_HINTS: Partial<Record<SpecSectionId, string>> = {\n model: \"fallbacks, session, caching, memory, skills\",\n prompt: \"schema\",\n permissions: \"tools, MCP, plugins\",\n environment: \"dotenv files\",\n};\n\nconst PROMPT_VARIANT_HINTS = {\n document: \"The .prompt document body and its explicit system fields.\",\n system: \"System prompt fields layered on top of the base agent prompt.\",\n} as const;\n\n// Full-page runtime spec editor (design \"Runtime Spec Editor v2\"): a live\n// summary rail with scrollspy nav and stacked numbered sections.\n// Container-responsive so it works embedded in a modal or standalone.\nexport function SpecRuntimeEditor({\n value,\n onChange,\n models = [],\n families,\n effectiveMode,\n effectiveModel,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n fixtureSchemas,\n sandboxCatalog,\n sandboxCreate,\n sections: sectionFilter,\n tabs,\n activeTab,\n onActiveTabChange,\n hostFields,\n promptVariant = \"runtime\",\n readOnly = false,\n className,\n title = \"Runtime Spec\",\n eyebrow = \"Agent configuration\",\n showHeader = true,\n beforeSections,\n defaultCollapsedSections,\n variant = \"run\",\n onSave,\n onCancel,\n saveLabel = \"Save & run\",\n footerStatus = \"Ready to run\",\n}: SpecRuntimeEditorProps) {\n const idPrefix = useId();\n const commitChange: (next: AISpecRuntimeValue) => void = readOnly\n ? () => undefined\n : onChange;\n const catalog = useMemo(\n () => buildPermissionCatalog(permissionCatalog, tools),\n [permissionCatalog, tools],\n );\n const runtimeFamilies = families?.length ? families : SPEC_RUNTIME_FAMILIES;\n const selectedFamily = familyForModel(\n runtimeFamilies,\n models,\n value.model || effectiveModel,\n );\n const specMode =\n runtimeModeFromModel(value.model) ||\n value.mode?.trim() ||\n effectiveMode?.trim() ||\n firstMode(runtimeFamilies[0] ?? SPEC_RUNTIME_FAMILIES[0]!).id;\n const runtimeError =\n runtimeModelError(value.model || effectiveModel) ??\n runtimeModeError(runtimeFamilies, specMode, selectedFamily?.id);\n const selectedRuntime = runtimeError\n ? undefined\n : modeOptionFor(runtimeFamilies, specMode, selectedFamily?.id);\n const supports = selectedRuntime\n ? runtimeFieldSupport(runtimeFamilies, specMode, selectedFamily?.id)\n : SUPPORT_ALL_RUNTIME_FIELDS;\n const runtimeSchema = selectedRuntime?.schema;\n const hasSandboxSection =\n runtimeSchema != null &&\n runtimeSchemaPropertyAtPath(runtimeSchema, \"sandbox.mode\") != null;\n const entries = useMemo(\n () => specPermissionEntries(value, catalog),\n [value, catalog],\n );\n const skillsSection = selectedRuntime\n ? (runtimeFieldSection(\n runtimeFamilies,\n specMode,\n \"permissions.skills\",\n selectedFamily?.id,\n ) ?? \"model\")\n : \"model\";\n const modelSkillEntries = entries.filter(\n (entry) =>\n entry.domain === \"skills\" &&\n skillsSection === \"model\" &&\n supports(\"permissions.skills\"),\n );\n const permissionEntries = entries.filter(\n (entry) =>\n (entry.domain !== \"skills\" || skillsSection === \"permissions\") &&\n supports(`permissions.${entry.domain}`),\n );\n const hasPermissionSection =\n supports(\"permissions.mode\") ||\n (skillsSection === \"permissions\" && supports(\"permissions.skills\")) ||\n ([\"tools\", \"mcp\", \"plugins\"] as const).some((domain) =>\n supports(`permissions.${domain}`),\n );\n\n if (tabs && sectionFilter) {\n throw new Error(\"SpecRuntimeEditor: pass either sections or tabs, not both\");\n }\n const requestedSections = useMemo(() => {\n const ids = tabs ? tabs.flatMap((tab) => tab.sections ?? []) : sectionFilter;\n if (!ids) return SPEC_RUNTIME_SECTIONS;\n return ids.map((id) => {\n const section = SPEC_RUNTIME_SECTIONS.find(\n (candidate) => candidate.id === id,\n );\n if (!section)\n throw new Error(`unknown runtime editor section ${JSON.stringify(id)}`);\n return section;\n });\n }, [sectionFilter, tabs]);\n // Sandbox modes come from the selected runtime schema. The adapter catalog is\n // optional metadata for configured Docker and Git Agent backends.\n const sections = requestedSections.filter(\n (section) =>\n (section.id !== \"cli\" || (cliOptions && supports(\"cliArgs\"))) &&\n (section.id !== \"sandbox\" || hasSandboxSection) &&\n (section.id !== \"permissions\" || hasPermissionSection),\n );\n const collapsedSections = useMemo(\n () => new Set(defaultCollapsedSections ?? []),\n [defaultCollapsedSections],\n );\n const domId = (id: SpecSectionId) => `${idPrefix}-${id}`;\n const { sectionRef } = useScrollSpy(\n sections.map((section) => domId(section.id)),\n );\n\n const applyEntries = (\n applied: Parameters<typeof withPermissionEntries>[1],\n mode: Parameters<typeof withPermissionEntries>[2],\n ) => commitChange(withPermissionEntries(value, applied, mode));\n const addEntry = (\n domain: Parameters<typeof withAddedPermission>[1],\n id: string,\n ) => {\n const next = withAddedPermission(value, domain, id);\n if (next) commitChange(next);\n };\n\n const sectionBody = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelSection\n value={value}\n onChange={commitChange}\n models={models}\n effectiveMode={effectiveMode}\n effectiveModel={effectiveModel}\n families={runtimeFamilies}\n {...(hostFields ? { hostFields } : {})}\n />\n );\n case \"prompt\":\n return (\n <PromptSection\n value={value}\n onChange={commitChange}\n supports={supports}\n variant={promptVariant}\n />\n );\n case \"workspace\":\n return (\n <WorkspaceSection\n value={value}\n onChange={commitChange}\n secretSelector={secretSelector}\n variant={variant}\n supports={supports}\n />\n );\n case \"sandbox\":\n return runtimeSchema ? (\n <SandboxSection\n value={value}\n onChange={commitChange}\n schema={runtimeSchema}\n {...(sandboxCatalog ? { catalog: sandboxCatalog } : {})}\n {...(sandboxCreate ? { createConfig: sandboxCreate } : {})}\n />\n ) : null;\n case \"permissions\":\n return supports(\"permissions\") ? (\n <PermissionsSection\n value={value}\n onChange={commitChange}\n families={runtimeFamilies}\n {...(runtimeSchema ? { schema: runtimeSchema } : {})}\n effectiveMode={effectiveMode}\n />\n ) : null;\n case \"environment\":\n return (\n <EnvironmentSection\n value={value}\n onChange={commitChange}\n secretSelector={secretSelector}\n />\n );\n case \"verify\":\n return (\n <VerifySection\n value={value}\n onChange={commitChange}\n models={models}\n families={runtimeFamilies}\n {...(secretSelector ? { secretSelector } : {})}\n {...(fixtureSchemas ? { fixtureSchemas } : {})}\n />\n );\n case \"commit\":\n return <CommitSection value={value} onChange={commitChange} />;\n case \"cli\":\n return cliOptions ? (\n <CLIArgsSection\n value={value}\n onChange={commitChange}\n cliOptions={cliOptions}\n />\n ) : null;\n }\n };\n\n const sectionAdvanced = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <div className=\"grid gap-density-3\">\n <ModelAdvanced\n value={value}\n onChange={commitChange}\n models={models}\n supports={supports}\n families={runtimeFamilies}\n />\n <ModelContextAdvanced\n value={value}\n onChange={commitChange}\n entries={modelSkillEntries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n showSkills={skillsSection === \"model\"}\n supports={supports}\n />\n </div>\n );\n case \"prompt\":\n return supports(\"prompt.schema\") ? (\n <PromptAdvanced value={value} onChange={commitChange} />\n ) : undefined;\n case \"permissions\":\n return (\n <PermissionsAdvanced\n entries={permissionEntries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n includeSkills={skillsSection === \"permissions\"}\n supports={supports}\n />\n );\n case \"environment\":\n return variant === \"run\" ? (\n <EnvironmentAdvanced value={value} onChange={commitChange} />\n ) : undefined;\n default:\n return undefined;\n }\n };\n\n const valueControls = (content: ReactNode) =>\n readOnly && content ? (\n <fieldset disabled className=\"m-0 min-w-0 border-0 p-0\">\n {content}\n </fieldset>\n ) : (\n content\n );\n\n const sectionCard = (\n section: SpecSectionMeta,\n { number, bare = false }: { number?: string; bare?: boolean },\n ) => (\n <SectionCard\n key={section.id}\n meta={\n section.id === \"prompt\" && promptVariant !== \"runtime\"\n ? { ...section, hint: PROMPT_VARIANT_HINTS[promptVariant] }\n : section\n }\n {...(number ? { number } : {})}\n bare={bare}\n domId={domId(section.id)}\n sectionRef={sectionRef(domId(section.id))}\n advanced={valueControls(sectionAdvanced(section.id))}\n advancedHint={ADVANCED_HINTS[section.id]}\n defaultCollapsed={collapsedSections.has(section.id)}\n >\n {valueControls(sectionBody(section.id))}\n </SectionCard>\n );\n\n return (\n <div className={cn(\"@container\", className)}>\n <div\n className={\n tabs\n ? \"grid grid-cols-1 gap-density-3\"\n : \"mx-auto max-w-[820px] px-density-4 py-density-4\"\n }\n >\n {showHeader && (\n <Rail\n eyebrow={eyebrow}\n title={title}\n target={summarizeTarget(value)}\n />\n )}\n {runtimeError ? (\n <div\n role=\"alert\"\n className=\"mb-density-3 rounded-md border border-destructive/40 bg-destructive/10 px-density-3 py-density-2 text-sm text-destructive\"\n >\n {runtimeError} Select a valid mode below or switch to Raw to repair\n the prompt source.\n </div>\n ) : null}\n {beforeSections}\n {tabs ? (\n <SectionTabs\n tabs={tabs}\n sections={sections}\n activeTab={activeTab}\n onActiveTabChange={onActiveTabChange}\n renderSection={(section, { bare }) => sectionCard(section, { bare })}\n />\n ) : (\n sections.map((section, index) =>\n sectionCard(section, { number: String(index + 1).padStart(2, \"0\") }),\n )\n )}\n </div>\n {(onSave || onCancel) && (\n <Footer\n status={footerStatus}\n saveLabel={saveLabel}\n onSave={onSave}\n onCancel={onCancel}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAkIA,MAAM,iBAAyD;AAAA,EAC7D,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AACf;AAEA,MAAM,uBAAuB;AAAA,EAC3B,UAAU;AAAA,EACV,QAAQ;AACV;AAKO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA,SAAS,CAAA;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,CAAA;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AACjB,GAA2B;;AACzB,QAAM,WAAW,MAAA;AACjB,QAAM,eAAmD,WACrD,MAAM,SACN;AACJ,QAAM,UAAU;AAAA,IACd,MAAM,uBAAuB,mBAAmB,KAAK;AAAA,IACrD,CAAC,mBAAmB,KAAK;AAAA,EAAA;AAE3B,QAAM,mBAAkB,qCAAU,UAAS,WAAW;AACtD,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,MAAM,SAAS;AAAA,EAAA;AAEjB,QAAM,WACJ,qBAAqB,MAAM,KAAK,OAChC,WAAM,SAAN,mBAAY,YACZ,+CAAe,WACf,UAAU,gBAAgB,CAAC,KAAK,sBAAsB,CAAC,CAAE,EAAE;AAC7D,QAAM,eACJ,kBAAkB,MAAM,SAAS,cAAc,KAC/C,iBAAiB,iBAAiB,UAAU,iDAAgB,EAAE;AAChE,QAAM,kBAAkB,eACpB,SACA,cAAc,iBAAiB,UAAU,iDAAgB,EAAE;AAC/D,QAAM,WAAW,kBACb,oBAAoB,iBAAiB,UAAU,iDAAgB,EAAE,IACjE;AACJ,QAAM,gBAAgB,mDAAiB;AACvC,QAAM,oBACJ,iBAAiB,QACjB,4BAA4B,eAAe,cAAc,KAAK;AAChE,QAAM,UAAU;AAAA,IACd,MAAM,sBAAsB,OAAO,OAAO;AAAA,IAC1C,CAAC,OAAO,OAAO;AAAA,EAAA;AAEjB,QAAM,gBAAgB,kBACjB;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,iDAAgB;AAAA,EAAA,KACb,UACL;AACJ,QAAM,oBAAoB,QAAQ;AAAA,IAChC,CAAC,UACC,MAAM,WAAW,YACjB,kBAAkB,WAClB,SAAS,oBAAoB;AAAA,EAAA;AAEjC,QAAM,oBAAoB,QAAQ;AAAA,IAChC,CAAC,WACE,MAAM,WAAW,YAAY,kBAAkB,kBAChD,SAAS,eAAe,MAAM,MAAM,EAAE;AAAA,EAAA;AAE1C,QAAM,uBACJ,SAAS,kBAAkB,KAC1B,kBAAkB,iBAAiB,SAAS,oBAAoB,KAChE,CAAC,SAAS,OAAO,SAAS,EAAY;AAAA,IAAK,CAAC,WAC3C,SAAS,eAAe,MAAM,EAAE;AAAA,EAAA;AAGpC,MAAI,QAAQ,eAAe;AACzB,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,QAAM,oBAAoB,QAAQ,MAAM;AACtC,UAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,QAAQ,IAAI,YAAY,CAAA,CAAE,IAAI;AAC/D,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,IAAI,IAAI,CAAC,OAAO;AACrB,YAAM,UAAU,sBAAsB;AAAA,QACpC,CAAC,cAAc,UAAU,OAAO;AAAA,MAAA;AAElC,UAAI,CAAC;AACH,cAAM,IAAI,MAAM,kCAAkC,KAAK,UAAU,EAAE,CAAC,EAAE;AACxE,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,eAAe,IAAI,CAAC;AAGxB,QAAM,WAAW,kBAAkB;AAAA,IACjC,CAAC,aACE,QAAQ,OAAO,SAAU,cAAc,SAAS,SAAS,OACzD,QAAQ,OAAO,aAAa,uBAC5B,QAAQ,OAAO,iBAAiB;AAAA,EAAA;AAErC,QAAM,oBAAoB;AAAA,IACxB,MAAM,IAAI,IAAI,4BAA4B,EAAE;AAAA,IAC5C,CAAC,wBAAwB;AAAA,EAAA;AAE3B,QAAM,QAAQ,CAAC,OAAsB,GAAG,QAAQ,IAAI,EAAE;AACtD,QAAM,EAAE,eAAe;AAAA,IACrB,SAAS,IAAI,CAAC,YAAY,MAAM,QAAQ,EAAE,CAAC;AAAA,EAAA;AAG7C,QAAM,eAAe,CACnB,SACA,SACG,aAAa,sBAAsB,OAAO,SAAS,IAAI,CAAC;AAC7D,QAAM,WAAW,CACf,QACA,OACG;AACH,UAAM,OAAO,oBAAoB,OAAO,QAAQ,EAAE;AAClD,QAAI,mBAAmB,IAAI;AAAA,EAC7B;AAEA,QAAM,cAAc,CAAC,OAAiC;AACpD,YAAQ,IAAA;AAAA,MACN,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACT,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,UAAC;AAAA,QAAA;AAAA,MAG1C,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA,SAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MAGf,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eAAO,gBACL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV,QAAQ;AAAA,YACP,GAAI,iBAAiB,EAAE,SAAS,eAAA,IAAmB,CAAA;AAAA,YACnD,GAAI,gBAAgB,EAAE,cAAc,kBAAkB,CAAA;AAAA,UAAC;AAAA,QAAA,IAExD;AAAA,MACN,KAAK;AACH,eAAO,SAAS,aAAa,IAC3B;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV,UAAU;AAAA,YACT,GAAI,gBAAgB,EAAE,QAAQ,cAAA,IAAkB,CAAA;AAAA,YACjD;AAAA,UAAA;AAAA,QAAA,IAEA;AAAA,MACN,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA,UAAU;AAAA,YACT,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,YAC1C,GAAI,iBAAiB,EAAE,mBAAmB,CAAA;AAAA,UAAC;AAAA,QAAA;AAAA,MAGlD,KAAK;AACH,eAAO,oBAAC,eAAA,EAAc,OAAc,UAAU,aAAA,CAAc;AAAA,MAC9D,KAAK;AACH,eAAO,aACL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV;AAAA,UAAA;AAAA,QAAA,IAEA;AAAA,IAAA;AAAA,EAEV;AAEA,QAAM,kBAAkB,CAAC,OAAiC;AACxD,YAAQ,IAAA;AAAA,MACN,KAAK;AACH,eACE,qBAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA,UAAU;AAAA,cACV;AAAA,cACA;AAAA,cACA,UAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA,UAAU;AAAA,cACV,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,YAAY,kBAAkB;AAAA,cAC9B;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,GACF;AAAA,MAEJ,KAAK;AACH,eAAO,SAAS,eAAe,IAC7B,oBAAC,kBAAe,OAAc,UAAU,cAAc,IACpD;AAAA,MACN,KAAK;AACH,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,YAAY;AAAA,YACZ,eAAe,kBAAkB;AAAA,YACjC;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eAAO,YAAY,QACjB,oBAAC,uBAAoB,OAAc,UAAU,cAAc,IACzD;AAAA,MACN;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEA,QAAM,gBAAgB,CAAC,YACrB,YAAY,UACV,oBAAC,YAAA,EAAS,UAAQ,MAAC,WAAU,4BAC1B,UAAA,QAAA,CACH,IAEA;AAGJ,QAAM,cAAc,CAClB,SACA,EAAE,QAAQ,OAAO,YAEjB;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,MACE,QAAQ,OAAO,YAAY,kBAAkB,YACzC,EAAE,GAAG,SAAS,MAAM,qBAAqB,aAAa,MACtD;AAAA,MAEL,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,MAC3B;AAAA,MACA,OAAO,MAAM,QAAQ,EAAE;AAAA,MACvB,YAAY,WAAW,MAAM,QAAQ,EAAE,CAAC;AAAA,MACxC,UAAU,cAAc,gBAAgB,QAAQ,EAAE,CAAC;AAAA,MACnD,cAAc,eAAe,QAAQ,EAAE;AAAA,MACvC,kBAAkB,kBAAkB,IAAI,QAAQ,EAAE;AAAA,MAEjD,UAAA,cAAc,YAAY,QAAQ,EAAE,CAAC;AAAA,IAAA;AAAA,IAdjC,QAAQ;AAAA,EAAA;AAkBjB,8BACG,OAAA,EAAI,WAAW,GAAG,cAAc,SAAS,GACxC,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WACE,OACI,mCACA;AAAA,QAGL,UAAA;AAAA,UAAA,cACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,QAAQ,gBAAgB,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAGhC,eACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cAET,UAAA;AAAA,gBAAA;AAAA,gBAAa;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,IAGd;AAAA,UACH;AAAA,UACA,OACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,eAAe,CAAC,SAAS,EAAE,KAAA,MAAW,YAAY,SAAS,EAAE,KAAA,CAAM;AAAA,YAAA;AAAA,UAAA,IAGrE,SAAS;AAAA,YAAI,CAAC,SAAS,UACrB,YAAY,SAAS,EAAE,QAAQ,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,UAAA;AAAA,QACrE;AAAA,MAAA;AAAA,IAAA;AAAA,KAGF,UAAU,aACV;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, type ReactNode } from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type { FixtureFenceSchemas } from \"../../FixtureEditor/types\";\nimport type {\n AISpecRuntimeCommit,\n AISpecRuntimePermissionCatalog,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport type { SpecRuntimeSandboxCreateConfig } from \"../SandboxCreateWizard.model\";\nimport { CLIArgsSection, type SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nimport { CommitSection } from \"./CommitSection\";\nimport { EnvironmentAdvanced, EnvironmentSection } from \"./EnvironmentSection\";\nimport { Footer } from \"./Footer\";\nimport { ModelContextAdvanced } from \"./ModelContextAdvanced\";\nimport { ModelAdvanced, ModelSection } from \"./ModelSection\";\nimport { PermissionsAdvanced, PermissionsSection } from \"./PermissionsSection\";\nimport { PromptAdvanced, PromptSection } from \"./PromptSection\";\nimport { Rail } from \"./Rail\";\nimport { SandboxSection } from \"./SandboxSection\";\nimport { SectionCard } from \"./SectionCard\";\nimport { SectionTabs } from \"./SectionTabs\";\nimport { VerifySection } from \"./VerifySection\";\nimport { WorkspaceSection } from \"./WorkspaceSection\";\nimport {\n buildPermissionCatalog,\n specPermissionEntries,\n withAddedPermission,\n withPermissionEntries,\n} from \"./permissions-model\";\nimport { summarizeTarget } from \"./summaries\";\nimport {\n SPEC_RUNTIME_SECTIONS,\n type SpecRuntimeSandboxCatalog,\n type SpecRuntimeHostField,\n type SpecRuntimeSecretSelectorConfig,\n type SpecRuntimeTab,\n type SpecSectionId,\n type SpecSectionMeta,\n} from \"./types\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n firstMode,\n runtimeModeError,\n runtimeModeFromModel,\n runtimeModelError,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport { familyForModel } from \"../../../lib/runtime-family\";\nimport {\n runtimeFieldSection,\n runtimeFieldSupport,\n runtimeSchemaPropertyAtPath,\n SUPPORT_ALL_RUNTIME_FIELDS,\n} from \"../../runtime/runtime-field-support\";\nimport { useScrollSpy } from \"./use-scrollspy\";\n\nexport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nexport type {\n SpecRuntimeSandboxAgent,\n SpecRuntimeSandboxBackend,\n SpecRuntimeSandboxCatalog,\n SpecRuntimeSandboxKind,\n SpecRuntimeHostField,\n SpecRuntimeSecretSelectorConfig,\n SpecRuntimeTab,\n} from \"./types\";\nexport type { SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nexport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"../../runtime/runtime-mode\";\n\nexport type SpecRuntimeEditorProps = {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n /** Provider families for the two-axis Family → Mode picker in the model section. */\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode used to validate posture when this editable layer inherits it. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family. */\n effectiveModel?: string | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n /** Schema for the runtime's extra CLI args; enables the CLI flags section. */\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Runner schemas keyed by fixture kind or fence info, used by the verification editor. */\n fixtureSchemas?: FixtureFenceSchemas | undefined;\n /** Sandbox adapter catalog; enables the Sandbox section. */\n sandboxCatalog?: SpecRuntimeSandboxCatalog | undefined;\n /** Host-owned sandbox creation and credential-reference adapter. */\n sandboxCreate?: SpecRuntimeSandboxCreateConfig | undefined;\n /** Optional ordered section selection for embedded editors that only need part of the runtime spec. */\n sections?: readonly SpecSectionId[] | undefined;\n /** Groups sections behind a tab strip instead of stacking them; exclusive with `sections`. */\n tabs?: readonly SpecRuntimeTab[] | undefined;\n /** Controlled active tab id; falls back to the first visible tab when filtered out. */\n activeTab?: string | undefined;\n onActiveTabChange?: ((id: string) => void) | undefined;\n /** Model fields the host renders beside the editor; the Model section omits them. */\n hostFields?: readonly SpecRuntimeHostField[] | undefined;\n /**\n * `document` presents prompt.user as a complete .prompt body; `system` omits\n * prompt.user for hosts that edit it in their own composer.\n */\n promptVariant?: \"runtime\" | \"document\" | \"system\" | undefined;\n /** Disables value controls while preserving section navigation and disclosures. */\n readOnly?: boolean | undefined;\n className?: string | undefined;\n title?: ReactNode | undefined;\n eyebrow?: ReactNode | undefined;\n /** Hide the editor rail when a host modal already supplies the context. */\n showHeader?: boolean | undefined;\n /** Content rendered before the first section inside the editor column. */\n beforeSections?: ReactNode | undefined;\n /** Sections that should start collapsed in embedded contexts. */\n defaultCollapsedSections?: readonly SpecSectionId[] | undefined;\n /**\n * Commit stanza(s) inherited from a lower spec layer (e.g. the lifecycle\n * step's own workflow), shown in the Commit section as the current\n * selection — clearly marked inherited — only while the operator has not\n * set `value.workflow.commits` at all.\n */\n inheritedCommits?: AISpecRuntimeCommit[] | undefined;\n /** Restrict task-owned fields when editing a reusable preset fragment. */\n variant?: \"run\" | \"preset\" | undefined;\n /** Renders the sticky footer's save action when set. */\n onSave?: (() => void) | undefined;\n /** Renders the sticky footer's cancel action when set. */\n onCancel?: (() => void) | undefined;\n saveLabel?: string | undefined;\n footerStatus?: ReactNode | undefined;\n};\n\nconst ADVANCED_HINTS: Partial<Record<SpecSectionId, string>> = {\n model: \"fallbacks, session, caching, memory, skills\",\n prompt: \"schema\",\n permissions: \"tools, MCP, plugins\",\n environment: \"dotenv files\",\n};\n\nconst PROMPT_VARIANT_HINTS = {\n document: \"The .prompt document body and its explicit system fields.\",\n system: \"System prompt fields layered on top of the base agent prompt.\",\n} as const;\n\n// Full-page runtime spec editor (design \"Runtime Spec Editor v2\"): a live\n// summary rail with scrollspy nav and stacked numbered sections.\n// Container-responsive so it works embedded in a modal or standalone.\nexport function SpecRuntimeEditor({\n value,\n onChange,\n models = [],\n families,\n effectiveMode,\n effectiveModel,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n fixtureSchemas,\n sandboxCatalog,\n sandboxCreate,\n sections: sectionFilter,\n tabs,\n activeTab,\n onActiveTabChange,\n hostFields,\n promptVariant = \"runtime\",\n readOnly = false,\n className,\n title = \"Runtime Spec\",\n eyebrow = \"Agent configuration\",\n showHeader = true,\n beforeSections,\n defaultCollapsedSections,\n inheritedCommits,\n variant = \"run\",\n onSave,\n onCancel,\n saveLabel = \"Save & run\",\n footerStatus = \"Ready to run\",\n}: SpecRuntimeEditorProps) {\n const idPrefix = useId();\n const commitChange: (next: AISpecRuntimeValue) => void = readOnly\n ? () => undefined\n : onChange;\n const catalog = useMemo(\n () => buildPermissionCatalog(permissionCatalog, tools),\n [permissionCatalog, tools],\n );\n const runtimeFamilies = families?.length ? families : SPEC_RUNTIME_FAMILIES;\n const selectedFamily = familyForModel(\n runtimeFamilies,\n models,\n value.model || effectiveModel,\n );\n const specMode =\n runtimeModeFromModel(value.model) ||\n value.mode?.trim() ||\n effectiveMode?.trim() ||\n firstMode(runtimeFamilies[0] ?? SPEC_RUNTIME_FAMILIES[0]!).id;\n const runtimeError =\n runtimeModelError(value.model || effectiveModel) ??\n runtimeModeError(runtimeFamilies, specMode, selectedFamily?.id);\n const selectedRuntime = runtimeError\n ? undefined\n : modeOptionFor(runtimeFamilies, specMode, selectedFamily?.id);\n const supports = selectedRuntime\n ? runtimeFieldSupport(runtimeFamilies, specMode, selectedFamily?.id)\n : SUPPORT_ALL_RUNTIME_FIELDS;\n const runtimeSchema = selectedRuntime?.schema;\n const hasSandboxSection =\n runtimeSchema != null &&\n runtimeSchemaPropertyAtPath(runtimeSchema, \"sandbox.mode\") != null;\n const entries = useMemo(\n () => specPermissionEntries(value, catalog),\n [value, catalog],\n );\n const skillsSection = selectedRuntime\n ? (runtimeFieldSection(\n runtimeFamilies,\n specMode,\n \"permissions.skills\",\n selectedFamily?.id,\n ) ?? \"model\")\n : \"model\";\n const modelSkillEntries = entries.filter(\n (entry) =>\n entry.domain === \"skills\" &&\n skillsSection === \"model\" &&\n supports(\"permissions.skills\"),\n );\n const permissionEntries = entries.filter(\n (entry) =>\n (entry.domain !== \"skills\" || skillsSection === \"permissions\") &&\n supports(`permissions.${entry.domain}`),\n );\n const hasPermissionSection =\n supports(\"permissions.mode\") ||\n (skillsSection === \"permissions\" && supports(\"permissions.skills\")) ||\n ([\"tools\", \"mcp\", \"plugins\"] as const).some((domain) =>\n supports(`permissions.${domain}`),\n );\n\n if (tabs && sectionFilter) {\n throw new Error(\"SpecRuntimeEditor: pass either sections or tabs, not both\");\n }\n const requestedSections = useMemo(() => {\n const ids = tabs ? tabs.flatMap((tab) => tab.sections ?? []) : sectionFilter;\n if (!ids) return SPEC_RUNTIME_SECTIONS;\n return ids.map((id) => {\n const section = SPEC_RUNTIME_SECTIONS.find(\n (candidate) => candidate.id === id,\n );\n if (!section)\n throw new Error(`unknown runtime editor section ${JSON.stringify(id)}`);\n return section;\n });\n }, [sectionFilter, tabs]);\n // Sandbox modes come from the selected runtime schema. The adapter catalog is\n // optional metadata for configured Docker and Git Agent backends.\n const sections = requestedSections.filter(\n (section) =>\n (section.id !== \"cli\" || (cliOptions && supports(\"cliArgs\"))) &&\n (section.id !== \"sandbox\" || hasSandboxSection) &&\n (section.id !== \"permissions\" || hasPermissionSection),\n );\n const collapsedSections = useMemo(\n () => new Set(defaultCollapsedSections ?? []),\n [defaultCollapsedSections],\n );\n const domId = (id: SpecSectionId) => `${idPrefix}-${id}`;\n const { sectionRef } = useScrollSpy(\n sections.map((section) => domId(section.id)),\n );\n\n const applyEntries = (\n applied: Parameters<typeof withPermissionEntries>[1],\n mode: Parameters<typeof withPermissionEntries>[2],\n ) => commitChange(withPermissionEntries(value, applied, mode));\n const addEntry = (\n domain: Parameters<typeof withAddedPermission>[1],\n id: string,\n ) => {\n const next = withAddedPermission(value, domain, id);\n if (next) commitChange(next);\n };\n\n const sectionBody = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelSection\n value={value}\n onChange={commitChange}\n models={models}\n effectiveMode={effectiveMode}\n effectiveModel={effectiveModel}\n families={runtimeFamilies}\n {...(hostFields ? { hostFields } : {})}\n />\n );\n case \"prompt\":\n return (\n <PromptSection\n value={value}\n onChange={commitChange}\n supports={supports}\n variant={promptVariant}\n />\n );\n case \"workspace\":\n return (\n <WorkspaceSection\n value={value}\n onChange={commitChange}\n secretSelector={secretSelector}\n variant={variant}\n supports={supports}\n />\n );\n case \"sandbox\":\n return runtimeSchema ? (\n <SandboxSection\n value={value}\n onChange={commitChange}\n schema={runtimeSchema}\n {...(sandboxCatalog ? { catalog: sandboxCatalog } : {})}\n {...(sandboxCreate ? { createConfig: sandboxCreate } : {})}\n />\n ) : null;\n case \"permissions\":\n return supports(\"permissions\") ? (\n <PermissionsSection\n value={value}\n onChange={commitChange}\n families={runtimeFamilies}\n {...(runtimeSchema ? { schema: runtimeSchema } : {})}\n effectiveMode={effectiveMode}\n />\n ) : null;\n case \"environment\":\n return (\n <EnvironmentSection\n value={value}\n onChange={commitChange}\n secretSelector={secretSelector}\n />\n );\n case \"verify\":\n return (\n <VerifySection\n value={value}\n onChange={commitChange}\n models={models}\n families={runtimeFamilies}\n {...(secretSelector ? { secretSelector } : {})}\n {...(fixtureSchemas ? { fixtureSchemas } : {})}\n />\n );\n case \"commit\":\n return (\n <CommitSection\n value={value}\n onChange={commitChange}\n {...(inheritedCommits ? { inheritedCommits } : {})}\n />\n );\n case \"cli\":\n return cliOptions ? (\n <CLIArgsSection\n value={value}\n onChange={commitChange}\n cliOptions={cliOptions}\n />\n ) : null;\n }\n };\n\n const sectionAdvanced = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <div className=\"grid gap-density-3\">\n <ModelAdvanced\n value={value}\n onChange={commitChange}\n models={models}\n supports={supports}\n families={runtimeFamilies}\n />\n <ModelContextAdvanced\n value={value}\n onChange={commitChange}\n entries={modelSkillEntries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n showSkills={skillsSection === \"model\"}\n supports={supports}\n />\n </div>\n );\n case \"prompt\":\n return supports(\"prompt.schema\") ? (\n <PromptAdvanced value={value} onChange={commitChange} />\n ) : undefined;\n case \"permissions\":\n return (\n <PermissionsAdvanced\n entries={permissionEntries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n includeSkills={skillsSection === \"permissions\"}\n supports={supports}\n />\n );\n case \"environment\":\n return variant === \"run\" ? (\n <EnvironmentAdvanced value={value} onChange={commitChange} />\n ) : undefined;\n default:\n return undefined;\n }\n };\n\n const valueControls = (content: ReactNode) =>\n readOnly && content ? (\n <fieldset disabled className=\"m-0 min-w-0 border-0 p-0\">\n {content}\n </fieldset>\n ) : (\n content\n );\n\n const sectionCard = (\n section: SpecSectionMeta,\n { number, bare = false }: { number?: string; bare?: boolean },\n ) => (\n <SectionCard\n key={section.id}\n meta={\n section.id === \"prompt\" && promptVariant !== \"runtime\"\n ? { ...section, hint: PROMPT_VARIANT_HINTS[promptVariant] }\n : section\n }\n {...(number ? { number } : {})}\n bare={bare}\n domId={domId(section.id)}\n sectionRef={sectionRef(domId(section.id))}\n advanced={valueControls(sectionAdvanced(section.id))}\n advancedHint={ADVANCED_HINTS[section.id]}\n defaultCollapsed={collapsedSections.has(section.id)}\n >\n {valueControls(sectionBody(section.id))}\n </SectionCard>\n );\n\n return (\n <div className={cn(\"@container\", className)}>\n <div\n className={\n tabs\n ? \"grid grid-cols-1 gap-density-3\"\n : \"mx-auto max-w-[820px] px-density-4 py-density-4\"\n }\n >\n {showHeader && (\n <Rail\n eyebrow={eyebrow}\n title={title}\n target={summarizeTarget(value)}\n />\n )}\n {runtimeError ? (\n <div\n role=\"alert\"\n className=\"mb-density-3 rounded-md border border-destructive/40 bg-destructive/10 px-density-3 py-density-2 text-sm text-destructive\"\n >\n {runtimeError} Select a valid mode below or switch to Raw to repair\n the prompt source.\n </div>\n ) : null}\n {beforeSections}\n {tabs ? (\n <SectionTabs\n tabs={tabs}\n sections={sections}\n activeTab={activeTab}\n onActiveTabChange={onActiveTabChange}\n renderSection={(section, { bare }) => sectionCard(section, { bare })}\n />\n ) : (\n sections.map((section, index) =>\n sectionCard(section, { number: String(index + 1).padStart(2, \"0\") }),\n )\n )}\n </div>\n {(onSave || onCancel) && (\n <Footer\n status={footerStatus}\n saveLabel={saveLabel}\n onSave={onSave}\n onCancel={onCancel}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const agentActionIcons = require("../agent-action-icons.cjs");
|
|
4
|
-
const SpecRuntimeEditor_sandboxModel = require("../SpecRuntimeEditor.sandbox-model.cjs");
|
|
5
4
|
const UiPauseCircle = require("../../../icons/components/UiPauseCircle.cjs");
|
|
6
5
|
const UiShieldSlash = require("../../../icons/components/UiShieldSlash.cjs");
|
|
7
6
|
const UiPencilSimpleLine = require("../../../icons/components/UiPencilSimpleLine.cjs");
|
|
@@ -9,6 +8,7 @@ const UiHandPalm = require("../../../icons/components/UiHandPalm.cjs");
|
|
|
9
8
|
const UiLockOpen = require("../../../icons/components/UiLockOpen.cjs");
|
|
10
9
|
const UiRobotAi = require("../../../icons/components/UiRobotAi.cjs");
|
|
11
10
|
const UiLock = require("../../../icons/components/UiLock.cjs");
|
|
11
|
+
const SpecRuntimeEditor_sandboxModel = require("../SpecRuntimeEditor.sandbox-model.cjs");
|
|
12
12
|
const CODEX_PERMISSION_MODES = {
|
|
13
13
|
default: { icon: UiLock.UiLock, tone: "slate", label: "Read only" },
|
|
14
14
|
acceptEdits: {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { PERMISSION_MODE_ICONS } from "../agent-action-icons.js";
|
|
2
|
-
import { SPEC_PERMISSION_MODES } from "../SpecRuntimeEditor.sandbox-model.js";
|
|
3
2
|
import { UiPauseCircle } from "../../../icons/components/UiPauseCircle.js";
|
|
4
3
|
import { UiShieldSlash } from "../../../icons/components/UiShieldSlash.js";
|
|
5
4
|
import { UiPencilSimpleLine } from "../../../icons/components/UiPencilSimpleLine.js";
|
|
@@ -7,6 +6,7 @@ import { UiHandPalm } from "../../../icons/components/UiHandPalm.js";
|
|
|
7
6
|
import { UiLockOpen } from "../../../icons/components/UiLockOpen.js";
|
|
8
7
|
import { UiRobotAi } from "../../../icons/components/UiRobotAi.js";
|
|
9
8
|
import { UiLock } from "../../../icons/components/UiLock.js";
|
|
9
|
+
import { SPEC_PERMISSION_MODES } from "../SpecRuntimeEditor.sandbox-model.js";
|
|
10
10
|
const CODEX_PERMISSION_MODES = {
|
|
11
11
|
default: { icon: UiLock, tone: "slate", label: "Read only" },
|
|
12
12
|
acceptEdits: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summaries.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/summaries.ts"],"sourcesContent":["import type { ChatModel } from \"../../chat/types\";\nimport type {
|
|
1
|
+
{"version":3,"file":"summaries.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/summaries.ts"],"sourcesContent":["import type { ChatModel } from \"../../chat/types\";\nimport type {\n AISpecRuntimeCommit,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { UNSPECIFIED_LABEL } from \"../../runtime/unspecified\";\nimport {\n checkoutMode,\n commitPhase,\n commitPhaseFromEntry,\n worktreeMode,\n} from \"./update\";\nimport { isDenyMode, type PermissionListEntry } from \"./permissions-model\";\n\nexport function summarizeModel(\n value: AISpecRuntimeValue,\n models: ChatModel[] = [],\n): string {\n const parts: string[] = [];\n const model = value.model?.trim();\n if (model) {\n parts.push(models.find((m) => m.id === model)?.label ?? model);\n }\n if (value.effort) parts.push(value.effort);\n return parts.length > 0 ? parts.join(\" · \") : UNSPECIFIED_LABEL;\n}\n\nexport function summarizePrompt(value: AISpecRuntimeValue): string {\n const overrides = [\n value.prompt?.user,\n value.prompt?.system,\n value.prompt?.appendSystem,\n ].filter((text) => Boolean(text?.trim())).length;\n if (overrides === 0) return \"Base prompt only\";\n return `${overrides} override${overrides > 1 ? \"s\" : \"\"} set`;\n}\n\nexport function summarizeWorkspace(value: AISpecRuntimeValue): string {\n const mode = checkoutMode(value);\n if (mode === \"none\") return \"No checkout\";\n const parts: string[] = [mode];\n const ref = value.setup?.checkout?.ref?.trim();\n if (ref) parts.push(ref);\n const worktree = worktreeMode(value);\n parts.push(worktree === \"none\" ? \"in-place\" : `${worktree} worktree`);\n return parts.join(\" · \");\n}\n\nexport function summarizePermissions(\n _value: AISpecRuntimeValue,\n entries: PermissionListEntry[],\n): string {\n const parts: string[] = [];\n const denied = entries.filter(\n (entry) => entry.domain === \"tools\" && entry.mode === \"deny\",\n ).length;\n const off = entries.filter(\n (entry) => entry.domain !== \"tools\" && isDenyMode(entry.mode),\n ).length;\n if (denied > 0) parts.push(`${denied} denied`);\n if (off > 0) parts.push(`${off} off`);\n return parts.length > 0 ? parts.join(\" · \") : \"No overrides\";\n}\n\nexport function summarizeEnvironment(value: AISpecRuntimeValue): string {\n const vars = (value.setup?.envVars ?? []).filter((item) =>\n Boolean(item.name?.trim()),\n );\n if (vars.length === 0) return \"No variables\";\n const secrets = vars.filter((item) => {\n if (typeof item.valueFrom === \"string\") {\n return item.valueFrom.trim().startsWith(\"secret://\");\n }\n return Boolean(item.valueFrom?.secretKeyRef);\n }).length;\n const parts = [`${vars.length} var${vars.length !== 1 ? \"s\" : \"\"}`];\n if (secrets > 0) parts.push(`${secrets} secret`);\n return parts.join(\" · \");\n}\n\nexport function summarizeVerify(value: AISpecRuntimeValue): string {\n const verify = value.workflow?.verify;\n if (!verify) return \"No fixture\";\n const parts: string[] = [];\n if (verify.fixture?.trim()) parts.push(\"Fixture\");\n if (verify.scope === \"changed\") parts.push(\"changed files\");\n if (verify.maxIterations != null && verify.maxIterations > 0) {\n parts.push(\n `${verify.maxIterations} iteration${verify.maxIterations !== 1 ? \"s\" : \"\"}`,\n );\n }\n if (verify.commands?.length) {\n parts.push(`${verify.commands.length} command${verify.commands.length !== 1 ? \"s\" : \"\"}`);\n }\n if (verify.prompts?.length) {\n parts.push(`${verify.prompts.length} prompt${verify.prompts.length !== 1 ? \"s\" : \"\"}`);\n }\n return parts.length > 0 ? parts.join(\" · \") : \"No fixture\";\n}\n\nconst COMMIT_PHASE_SUMMARIES = {\n none: \"Leave uncommitted\",\n turn: \"Commit every turn\",\n agent: \"Commit after the loop\",\n run: \"Commit changes\",\n} as const;\n\n// Matches the CommitSection phase select's own option labels, since this is\n// the vocabulary the section reads back to the operator as \"what's selected\"\n// rather than the free-standing summary line's own copy.\nconst COMMIT_PHASE_SELECT_LABELS = {\n turn: \"Every turn\",\n agent: \"After the loop\",\n run: \"End of run\",\n} as const;\n\n/**\n * Reads back the effective commit intent: the operator's own policy, or —\n * only while `workflow.commits` is entirely unset and `inheritedCommits` is\n * non-empty — the inherited stanza from a lower spec layer, clearly marked so\n * it never reads as \"the operator chose this\".\n */\nexport function summarizeCommit(\n value: AISpecRuntimeValue,\n inheritedCommits?: AISpecRuntimeCommit[] | undefined,\n): string {\n const operatorSet = value.workflow?.commits !== undefined;\n const inherited = operatorSet ? undefined : inheritedCommits?.[0];\n if (inherited) {\n const parts = [\n COMMIT_PHASE_SELECT_LABELS[commitPhaseFromEntry(inherited)],\n \"inherited\",\n ];\n if (inherited.stage) parts.push(inherited.stage);\n if (inherited.gates) parts.push(`${inherited.gates} gates`);\n return parts.join(\" · \");\n }\n const phase = commitPhase(value);\n const summary = COMMIT_PHASE_SUMMARIES[phase];\n return value.workflow?.commits?.[0]?.dryRun\n ? `${summary} · dry run`\n : summary;\n}\n\nexport function summarizeCLIArgs(value: AISpecRuntimeValue): string {\n const flags = Object.entries(value.cliArgs ?? {}).filter(\n ([, item]) =>\n item !== undefined &&\n item !== \"\" &&\n item !== false &&\n (!Array.isArray(item) || item.length > 0),\n ).length;\n if (flags === 0) return \"Defaults\";\n return `${flags} flag${flags !== 1 ? \"s\" : \"\"} set`;\n}\n\n// The rail target chip: repo (from checkout URL or local path) plus ref.\nexport function summarizeTarget(value: AISpecRuntimeValue): string | undefined {\n const checkout = value.setup?.checkout;\n const source = checkout?.url?.trim() || checkout?.path?.trim();\n if (!source) return undefined;\n // Split-and-filter instead of `.replace(/\\/+$/, \"\")`: the trailing-slash\n // strip was a polynomial (ReDoS) match on many-`/` inputs. Empty segments\n // from trailing/duplicate slashes are dropped, so the last one is the repo.\n const segments = source.split(\"/\").filter(Boolean);\n const repo = segments[segments.length - 1]?.replace(/\\.git$/, \"\");\n if (!repo) return undefined;\n const ref = checkout?.ref?.trim();\n return ref ? `${repo} · ${ref}` : repo;\n}\n"],"names":[],"mappings":";;AA6JO,SAAS,gBAAgB,OAA+C;;AAC7E,QAAM,YAAW,WAAM,UAAN,mBAAa;AAC9B,QAAM,WAAS,0CAAU,QAAV,mBAAe,aAAU,0CAAU,SAAV,mBAAgB;AACxD,MAAI,CAAC,OAAQ,QAAO;AAIpB,QAAM,WAAW,OAAO,MAAM,GAAG,EAAE,OAAO,OAAO;AACjD,QAAM,QAAO,cAAS,SAAS,SAAS,CAAC,MAA5B,mBAA+B,QAAQ,UAAU;AAC9D,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAM,0CAAU,QAAV,mBAAe;AAC3B,SAAO,MAAM,GAAG,IAAI,MAAM,GAAG,KAAK;AACpC;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ChatModel } from '../../chat/types.js';
|
|
2
|
-
import { AISpecRuntimeValue } from '../SpecRuntimeEditor.model.js';
|
|
2
|
+
import { AISpecRuntimeCommit, AISpecRuntimeValue } from '../SpecRuntimeEditor.model.js';
|
|
3
3
|
import { PermissionListEntry } from './permissions-model.js';
|
|
4
4
|
export declare function summarizeModel(value: AISpecRuntimeValue, models?: ChatModel[]): string;
|
|
5
5
|
export declare function summarizePrompt(value: AISpecRuntimeValue): string;
|
|
@@ -7,7 +7,13 @@ export declare function summarizeWorkspace(value: AISpecRuntimeValue): string;
|
|
|
7
7
|
export declare function summarizePermissions(_value: AISpecRuntimeValue, entries: PermissionListEntry[]): string;
|
|
8
8
|
export declare function summarizeEnvironment(value: AISpecRuntimeValue): string;
|
|
9
9
|
export declare function summarizeVerify(value: AISpecRuntimeValue): string;
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Reads back the effective commit intent: the operator's own policy, or —
|
|
12
|
+
* only while `workflow.commits` is entirely unset and `inheritedCommits` is
|
|
13
|
+
* non-empty — the inherited stanza from a lower spec layer, clearly marked so
|
|
14
|
+
* it never reads as "the operator chose this".
|
|
15
|
+
*/
|
|
16
|
+
export declare function summarizeCommit(value: AISpecRuntimeValue, inheritedCommits?: AISpecRuntimeCommit[] | undefined): string;
|
|
11
17
|
export declare function summarizeCLIArgs(value: AISpecRuntimeValue): string;
|
|
12
18
|
export declare function summarizeTarget(value: AISpecRuntimeValue): string | undefined;
|
|
13
19
|
//# sourceMappingURL=summaries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summaries.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/summaries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"summaries.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/summaries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAQpC,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,wBAAgB,cAAc,CAC5B,KAAK,EAAE,kBAAkB,EACzB,MAAM,GAAE,SAAS,EAAO,GACvB,MAAM,CAQR;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAQjE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CASpE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,mBAAmB,EAAE,GAC7B,MAAM,CAWR;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CActE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAkBjE;AAkBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,GAAG,SAAS,GACnD,MAAM,CAiBR;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAUlE;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAY7E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summaries.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/summaries.ts"],"sourcesContent":["import type { ChatModel } from \"../../chat/types\";\nimport type {
|
|
1
|
+
{"version":3,"file":"summaries.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/summaries.ts"],"sourcesContent":["import type { ChatModel } from \"../../chat/types\";\nimport type {\n AISpecRuntimeCommit,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { UNSPECIFIED_LABEL } from \"../../runtime/unspecified\";\nimport {\n checkoutMode,\n commitPhase,\n commitPhaseFromEntry,\n worktreeMode,\n} from \"./update\";\nimport { isDenyMode, type PermissionListEntry } from \"./permissions-model\";\n\nexport function summarizeModel(\n value: AISpecRuntimeValue,\n models: ChatModel[] = [],\n): string {\n const parts: string[] = [];\n const model = value.model?.trim();\n if (model) {\n parts.push(models.find((m) => m.id === model)?.label ?? model);\n }\n if (value.effort) parts.push(value.effort);\n return parts.length > 0 ? parts.join(\" · \") : UNSPECIFIED_LABEL;\n}\n\nexport function summarizePrompt(value: AISpecRuntimeValue): string {\n const overrides = [\n value.prompt?.user,\n value.prompt?.system,\n value.prompt?.appendSystem,\n ].filter((text) => Boolean(text?.trim())).length;\n if (overrides === 0) return \"Base prompt only\";\n return `${overrides} override${overrides > 1 ? \"s\" : \"\"} set`;\n}\n\nexport function summarizeWorkspace(value: AISpecRuntimeValue): string {\n const mode = checkoutMode(value);\n if (mode === \"none\") return \"No checkout\";\n const parts: string[] = [mode];\n const ref = value.setup?.checkout?.ref?.trim();\n if (ref) parts.push(ref);\n const worktree = worktreeMode(value);\n parts.push(worktree === \"none\" ? \"in-place\" : `${worktree} worktree`);\n return parts.join(\" · \");\n}\n\nexport function summarizePermissions(\n _value: AISpecRuntimeValue,\n entries: PermissionListEntry[],\n): string {\n const parts: string[] = [];\n const denied = entries.filter(\n (entry) => entry.domain === \"tools\" && entry.mode === \"deny\",\n ).length;\n const off = entries.filter(\n (entry) => entry.domain !== \"tools\" && isDenyMode(entry.mode),\n ).length;\n if (denied > 0) parts.push(`${denied} denied`);\n if (off > 0) parts.push(`${off} off`);\n return parts.length > 0 ? parts.join(\" · \") : \"No overrides\";\n}\n\nexport function summarizeEnvironment(value: AISpecRuntimeValue): string {\n const vars = (value.setup?.envVars ?? []).filter((item) =>\n Boolean(item.name?.trim()),\n );\n if (vars.length === 0) return \"No variables\";\n const secrets = vars.filter((item) => {\n if (typeof item.valueFrom === \"string\") {\n return item.valueFrom.trim().startsWith(\"secret://\");\n }\n return Boolean(item.valueFrom?.secretKeyRef);\n }).length;\n const parts = [`${vars.length} var${vars.length !== 1 ? \"s\" : \"\"}`];\n if (secrets > 0) parts.push(`${secrets} secret`);\n return parts.join(\" · \");\n}\n\nexport function summarizeVerify(value: AISpecRuntimeValue): string {\n const verify = value.workflow?.verify;\n if (!verify) return \"No fixture\";\n const parts: string[] = [];\n if (verify.fixture?.trim()) parts.push(\"Fixture\");\n if (verify.scope === \"changed\") parts.push(\"changed files\");\n if (verify.maxIterations != null && verify.maxIterations > 0) {\n parts.push(\n `${verify.maxIterations} iteration${verify.maxIterations !== 1 ? \"s\" : \"\"}`,\n );\n }\n if (verify.commands?.length) {\n parts.push(`${verify.commands.length} command${verify.commands.length !== 1 ? \"s\" : \"\"}`);\n }\n if (verify.prompts?.length) {\n parts.push(`${verify.prompts.length} prompt${verify.prompts.length !== 1 ? \"s\" : \"\"}`);\n }\n return parts.length > 0 ? parts.join(\" · \") : \"No fixture\";\n}\n\nconst COMMIT_PHASE_SUMMARIES = {\n none: \"Leave uncommitted\",\n turn: \"Commit every turn\",\n agent: \"Commit after the loop\",\n run: \"Commit changes\",\n} as const;\n\n// Matches the CommitSection phase select's own option labels, since this is\n// the vocabulary the section reads back to the operator as \"what's selected\"\n// rather than the free-standing summary line's own copy.\nconst COMMIT_PHASE_SELECT_LABELS = {\n turn: \"Every turn\",\n agent: \"After the loop\",\n run: \"End of run\",\n} as const;\n\n/**\n * Reads back the effective commit intent: the operator's own policy, or —\n * only while `workflow.commits` is entirely unset and `inheritedCommits` is\n * non-empty — the inherited stanza from a lower spec layer, clearly marked so\n * it never reads as \"the operator chose this\".\n */\nexport function summarizeCommit(\n value: AISpecRuntimeValue,\n inheritedCommits?: AISpecRuntimeCommit[] | undefined,\n): string {\n const operatorSet = value.workflow?.commits !== undefined;\n const inherited = operatorSet ? undefined : inheritedCommits?.[0];\n if (inherited) {\n const parts = [\n COMMIT_PHASE_SELECT_LABELS[commitPhaseFromEntry(inherited)],\n \"inherited\",\n ];\n if (inherited.stage) parts.push(inherited.stage);\n if (inherited.gates) parts.push(`${inherited.gates} gates`);\n return parts.join(\" · \");\n }\n const phase = commitPhase(value);\n const summary = COMMIT_PHASE_SUMMARIES[phase];\n return value.workflow?.commits?.[0]?.dryRun\n ? `${summary} · dry run`\n : summary;\n}\n\nexport function summarizeCLIArgs(value: AISpecRuntimeValue): string {\n const flags = Object.entries(value.cliArgs ?? {}).filter(\n ([, item]) =>\n item !== undefined &&\n item !== \"\" &&\n item !== false &&\n (!Array.isArray(item) || item.length > 0),\n ).length;\n if (flags === 0) return \"Defaults\";\n return `${flags} flag${flags !== 1 ? \"s\" : \"\"} set`;\n}\n\n// The rail target chip: repo (from checkout URL or local path) plus ref.\nexport function summarizeTarget(value: AISpecRuntimeValue): string | undefined {\n const checkout = value.setup?.checkout;\n const source = checkout?.url?.trim() || checkout?.path?.trim();\n if (!source) return undefined;\n // Split-and-filter instead of `.replace(/\\/+$/, \"\")`: the trailing-slash\n // strip was a polynomial (ReDoS) match on many-`/` inputs. Empty segments\n // from trailing/duplicate slashes are dropped, so the last one is the repo.\n const segments = source.split(\"/\").filter(Boolean);\n const repo = segments[segments.length - 1]?.replace(/\\.git$/, \"\");\n if (!repo) return undefined;\n const ref = checkout?.ref?.trim();\n return ref ? `${repo} · ${ref}` : repo;\n}\n"],"names":[],"mappings":"AA6JO,SAAS,gBAAgB,OAA+C;AAAxE;AACL,QAAM,YAAW,WAAM,UAAN,mBAAa;AAC9B,QAAM,WAAS,0CAAU,QAAV,mBAAe,aAAU,0CAAU,SAAV,mBAAgB;AACxD,MAAI,CAAC,OAAQ,QAAO;AAIpB,QAAM,WAAW,OAAO,MAAM,GAAG,EAAE,OAAO,OAAO;AACjD,QAAM,QAAO,cAAS,SAAS,SAAS,CAAC,MAA5B,mBAA+B,QAAQ,UAAU;AAC9D,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAM,0CAAU,QAAV,mBAAe;AAC3B,SAAO,MAAM,GAAG,IAAI,MAAM,GAAG,KAAK;AACpC;"}
|
|
@@ -36,7 +36,9 @@ function sandboxRef(value) {
|
|
|
36
36
|
function withSandbox(value, patch) {
|
|
37
37
|
const next = { ...sandboxRef(value), ...patch };
|
|
38
38
|
if (!next.mode) {
|
|
39
|
-
throw new Error(
|
|
39
|
+
throw new Error(
|
|
40
|
+
"sandbox.mode is required before configuring sandbox settings"
|
|
41
|
+
);
|
|
40
42
|
}
|
|
41
43
|
return withRoot(value, { sandbox: next });
|
|
42
44
|
}
|
|
@@ -114,12 +116,15 @@ function withCommitPhase(value, phase) {
|
|
|
114
116
|
}
|
|
115
117
|
return withCommit(value, { on: phase });
|
|
116
118
|
}
|
|
119
|
+
function commitPhaseFromEntry(commit) {
|
|
120
|
+
const on = commit == null ? void 0 : commit.on;
|
|
121
|
+
return on === "turn" || on === "agent" ? on : "run";
|
|
122
|
+
}
|
|
117
123
|
function commitPhase(value) {
|
|
118
|
-
var _a
|
|
124
|
+
var _a;
|
|
119
125
|
const commits = (_a = value.workflow) == null ? void 0 : _a.commits;
|
|
120
126
|
if (!(commits == null ? void 0 : commits.length)) return "none";
|
|
121
|
-
|
|
122
|
-
return on === "turn" || on === "agent" ? on : "run";
|
|
127
|
+
return commitPhaseFromEntry(commits[0]);
|
|
123
128
|
}
|
|
124
129
|
function withCheckoutMode(value, mode) {
|
|
125
130
|
if (mode === "none") {
|
|
@@ -137,6 +142,7 @@ function withCheckoutMode(value, mode) {
|
|
|
137
142
|
return withCheckout(value, { mode, path: "" });
|
|
138
143
|
}
|
|
139
144
|
function withWorktreeMode(value, mode) {
|
|
145
|
+
var _a;
|
|
140
146
|
if (mode === "none") {
|
|
141
147
|
return withWorktree(value, {
|
|
142
148
|
mode,
|
|
@@ -146,10 +152,11 @@ function withWorktreeMode(value, mode) {
|
|
|
146
152
|
keep: false
|
|
147
153
|
});
|
|
148
154
|
}
|
|
155
|
+
const next = ((_a = value.workflow) == null ? void 0 : _a.commits) === void 0 ? withCommitPhase(value, "turn") : value;
|
|
149
156
|
if (mode === "existing") {
|
|
150
|
-
return withWorktree(
|
|
157
|
+
return withWorktree(next, { mode, prefix: "", base: "", keep: false });
|
|
151
158
|
}
|
|
152
|
-
return withWorktree(
|
|
159
|
+
return withWorktree(next, { mode });
|
|
153
160
|
}
|
|
154
161
|
function checkoutMode(value) {
|
|
155
162
|
var _a;
|
|
@@ -167,6 +174,7 @@ function worktreeMode(value) {
|
|
|
167
174
|
}
|
|
168
175
|
exports.checkoutMode = checkoutMode;
|
|
169
176
|
exports.commitPhase = commitPhase;
|
|
177
|
+
exports.commitPhaseFromEntry = commitPhaseFromEntry;
|
|
170
178
|
exports.sandboxRef = sandboxRef;
|
|
171
179
|
exports.withBudgetValue = withBudgetValue;
|
|
172
180
|
exports.withCheckout = withCheckout;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/update.ts"],"sourcesContent":["import type {\n AISpecRuntimeConnections,\n AISpecRuntimeMemory,\n AISpecRuntimePermissions,\n AISpecRuntimePrompt,\n AISpecRuntimeSandbox,\n AISpecRuntimeSandboxDispatch,\n AISpecRuntimeSandboxPolicy,\n AISpecRuntimeSetup,\n AISpecRuntimeValue,\n SpecCheckoutMode,\n SpecCommitPhase,\n SpecPermissionMode,\n SpecSandboxMode,\n SpecStashMode,\n SpecWorktreeMode,\n} from \"../SpecRuntimeEditor.model\";\n\ntype SpecCheckout = NonNullable<AISpecRuntimeSetup[\"checkout\"]>;\ntype SpecWorktree = NonNullable<SpecCheckout[\"worktree\"]>;\ntype SpecDirty = NonNullable<SpecCheckout[\"dirty\"]>;\ntype SpecWorkflow = NonNullable<AISpecRuntimeValue[\"workflow\"]>;\ntype SpecCommit = NonNullable<SpecWorkflow[\"commits\"]>[number];\ntype SpecBudget = NonNullable<AISpecRuntimeValue[\"budget\"]>;\n\nexport function withRoot(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeValue>,\n): AISpecRuntimeValue {\n return { ...value, ...patch };\n}\n\n// Sets a top-level scalar, deleting the key entirely when cleared so the\n// compacted payload omits it instead of carrying an empty string/undefined.\nexport function withOptionalRoot(\n value: AISpecRuntimeValue,\n key: keyof AISpecRuntimeValue,\n next: unknown,\n): AISpecRuntimeValue {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as AISpecRuntimeValue;\n}\n\nexport function withPrompt(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimePrompt>,\n): AISpecRuntimeValue {\n return withRoot(value, { prompt: { ...value.prompt, ...patch } });\n}\n\nexport function withBudget(\n value: AISpecRuntimeValue,\n budget: SpecBudget,\n): AISpecRuntimeValue {\n return withRoot(value, { budget });\n}\n\nexport function withBudgetValue(\n value: AISpecRuntimeValue,\n key: keyof SpecBudget,\n next: number | string | undefined,\n): AISpecRuntimeValue {\n const budget = { ...value.budget } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete budget[key];\n } else {\n budget[key] = next;\n }\n return withRoot(value, { budget: budget as SpecBudget });\n}\n\nexport function withMemory(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeMemory>,\n): AISpecRuntimeValue {\n return withRoot(value, { memory: { ...value.memory, ...patch } });\n}\n\nexport function withPermissions(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimePermissions>,\n): AISpecRuntimeValue {\n return withRoot(value, { permissions: { ...value.permissions, ...patch } });\n}\n\n/**\n * Reads the sandbox ref in object form regardless of which form it is stored\n * in, so the section's controls do not each have to re-narrow the union.\n */\nexport function sandboxRef(value: AISpecRuntimeValue): AISpecRuntimeSandbox {\n if (typeof value.sandbox === \"string\") {\n return { mode: value.sandbox.trim() as SpecSandboxMode };\n }\n return value.sandbox ?? {};\n}\n\n/**\n * Patches the unified ref while keeping its object form during editing.\n */\nexport function withSandbox(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandbox>,\n): AISpecRuntimeValue {\n const next: AISpecRuntimeSandbox = { ...sandboxRef(value), ...patch };\n if (!next.mode) {\n throw new Error(\"sandbox.mode is required before configuring sandbox settings\");\n }\n return withRoot(value, { sandbox: next });\n}\n\nexport function withSandboxMode(\n value: AISpecRuntimeValue,\n mode: SpecSandboxMode,\n): AISpecRuntimeValue {\n const current = sandboxRef(value);\n if (current.mode === mode) return value;\n return withRoot(value, { sandbox: { mode } });\n}\n\nexport function withSandboxBackend(\n value: AISpecRuntimeValue,\n backend: string,\n): AISpecRuntimeValue {\n const next = { ...sandboxRef(value) };\n const selected = backend.trim();\n if (selected) next.backend = selected;\n else delete next.backend;\n return withRoot(value, { sandbox: next });\n}\n\nexport function withSandboxAgent(\n value: AISpecRuntimeValue,\n agent: string,\n): AISpecRuntimeValue {\n const next = { ...sandboxRef(value) };\n const selected = agent.trim();\n if (selected) next.agent = selected;\n else delete next.agent;\n return withRoot(value, { sandbox: next });\n}\n\n// The base posture is independent of the sandbox (see AISpecRuntimePermissions\n// doc comment), so unlike sandbox settings it deletes cleanly to Unspecified\n// without needing a mode to be configured first.\nexport function withPermissionMode(\n value: AISpecRuntimeValue,\n mode: SpecPermissionMode | undefined,\n): AISpecRuntimeValue {\n const next = { ...value.permissions } as AISpecRuntimePermissions;\n if (mode) next.mode = mode;\n else delete next.mode;\n if (Object.keys(next).length === 0) {\n const { permissions: _permissions, ...rest } = value;\n return rest as AISpecRuntimeValue;\n }\n return withRoot(value, { permissions: next });\n}\n\nexport function withSandboxPolicy(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandboxPolicy>,\n): AISpecRuntimeValue {\n if (sandboxRef(value).mode !== \"native\") {\n throw new Error(\"native sandbox policy requires sandbox.mode native\");\n }\n return withSandbox(value, {\n policy: { ...sandboxRef(value).policy, ...patch },\n });\n}\n\nexport function withSandboxDispatch(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandboxDispatch>,\n): AISpecRuntimeValue {\n if (sandboxRef(value).mode !== \"git-agent\") {\n throw new Error(\"sandbox dispatch policy requires sandbox.mode git-agent\");\n }\n return withSandbox(value, {\n dispatch: { ...sandboxRef(value).dispatch, ...patch },\n });\n}\n\nexport function withSetup(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSetup>,\n): AISpecRuntimeValue {\n return withRoot(value, { setup: { ...value.setup, ...patch } });\n}\n\nexport function withConnections(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeConnections>,\n): AISpecRuntimeValue {\n return withSetup(value, {\n connections: { ...value.setup?.connections, ...patch },\n });\n}\n\nexport function withCheckout(\n value: AISpecRuntimeValue,\n patch: SpecCheckout,\n): AISpecRuntimeValue {\n return withSetup(value, {\n checkout: { ...value.setup?.checkout, ...patch },\n });\n}\n\nexport function withWorktree(\n value: AISpecRuntimeValue,\n patch: SpecWorktree,\n): AISpecRuntimeValue {\n return withCheckout(value, {\n worktree: { ...value.setup?.checkout?.worktree, ...patch },\n });\n}\n\nexport function withDirty(\n value: AISpecRuntimeValue,\n patch: SpecDirty,\n): AISpecRuntimeValue {\n return withCheckout(value, {\n dirty: { ...value.setup?.checkout?.dirty, ...patch },\n });\n}\n\nexport function withVerify(\n value: AISpecRuntimeValue,\n patch: NonNullable<SpecWorkflow[\"verify\"]>,\n): AISpecRuntimeValue {\n return withRoot(value, {\n workflow: {\n ...value.workflow,\n verify: { ...value.workflow?.verify, ...patch },\n },\n });\n}\n\n// The editor drives a single commit policy. A spec authored by hand may declare\n// several stanzas; the ones past the first are carried through untouched rather\n// than collapsed away by an edit to a field the editor does surface.\nexport function withCommit(\n value: AISpecRuntimeValue,\n patch: Partial<SpecCommit>,\n): AISpecRuntimeValue {\n const [first, ...rest] = value.workflow?.commits ?? [];\n return withRoot(value, {\n workflow: { ...value.workflow, commits: [{ ...first, ...patch }, ...rest] },\n });\n}\n\n// \"Never\" drops every stanza rather than flagging one off: an absent list is how\n// the spec says \"commit nothing\", and a surviving {dryRun: true} would leave the\n// section reading as configured.\nexport function withCommitPhase(\n value: AISpecRuntimeValue,\n phase: SpecCommitPhase | \"none\",\n): AISpecRuntimeValue {\n if (phase === \"none\") {\n return withRoot(value, { workflow: { ...value.workflow, commits: [] } });\n }\n return withCommit(value, { on: phase });\n}\n\n// A stanza with no explicit phase commits at the end of the run, matching\n// api.Commit.Phase()'s default.\nexport function commitPhase(\n value: AISpecRuntimeValue,\n): SpecCommitPhase | \"none\" {\n const commits = value.workflow?.commits;\n if (!commits?.length) return \"none\";\n const on = commits[0]?.on;\n return on === \"turn\" || on === \"agent\" ? on : \"run\";\n}\n\n// Mode switches clear the fields that no longer apply, so stale values from a\n// previous mode never leak into the compacted payload.\nexport function withCheckoutMode(\n value: AISpecRuntimeValue,\n mode: SpecCheckoutMode,\n): AISpecRuntimeValue {\n if (mode === \"none\") {\n return withCheckout(value, {\n mode,\n url: \"\",\n path: \"\",\n connection: \"\",\n ref: \"\",\n depth: 0,\n });\n }\n if (mode === \"local\")\n return withCheckout(value, { mode, url: \"\", connection: \"\" });\n return withCheckout(value, { mode, path: \"\" });\n}\n\nexport function withWorktreeMode(\n value: AISpecRuntimeValue,\n mode: SpecWorktreeMode,\n): AISpecRuntimeValue {\n if (mode === \"none\") {\n return withWorktree(value, {\n mode,\n prefix: \"\",\n base: \"\",\n path: \"\",\n keep: false,\n });\n }\n if (mode === \"existing\") {\n return withWorktree(value, { mode, prefix: \"\", base: \"\", keep: false });\n }\n return withWorktree(value, { mode });\n}\n\nexport function withStashMode(\n value: AISpecRuntimeValue,\n stash: SpecStashMode,\n): AISpecRuntimeValue {\n return withDirty(value, stash === \"none\" ? { stash, since: \"\" } : { stash });\n}\n\nexport function checkoutMode(value: AISpecRuntimeValue): SpecCheckoutMode {\n const checkout = value.setup?.checkout;\n if (checkout?.mode === \"remote\") return \"remote\";\n if (checkout?.mode === \"local\" || checkout?.path) return \"local\";\n return \"none\";\n}\n\nexport function worktreeMode(value: AISpecRuntimeValue): SpecWorktreeMode {\n const mode = value.setup?.checkout?.worktree?.mode;\n if (mode === \"existing\") return \"existing\";\n if (mode === \"new\") return \"new\";\n return \"none\";\n}\n\nexport function stashMode(value: AISpecRuntimeValue): SpecStashMode {\n const stash = value.setup?.checkout?.dirty?.stash;\n if (\n stash === \"untracked\" ||\n stash === \"unstaged\" ||\n stash === \"staged\" ||\n stash === \"all\"\n ) {\n return stash;\n }\n return \"none\";\n}\n\nexport function parseOptionalNumber(\n value: string,\n integer = false,\n): number | undefined {\n if (value.trim() === \"\") return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) return undefined;\n return integer ? Math.max(0, Math.trunc(parsed)) : parsed;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"update.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/update.ts"],"sourcesContent":["import type {\n AISpecRuntimeConnections,\n AISpecRuntimeMemory,\n AISpecRuntimePermissions,\n AISpecRuntimePrompt,\n AISpecRuntimeSandbox,\n AISpecRuntimeSandboxDispatch,\n AISpecRuntimeSandboxPolicy,\n AISpecRuntimeSetup,\n AISpecRuntimeValue,\n SpecCheckoutMode,\n SpecCommitPhase,\n SpecPermissionMode,\n SpecSandboxMode,\n SpecStashMode,\n SpecWorktreeMode,\n} from \"../SpecRuntimeEditor.model\";\n\ntype SpecCheckout = NonNullable<AISpecRuntimeSetup[\"checkout\"]>;\ntype SpecWorktree = NonNullable<SpecCheckout[\"worktree\"]>;\ntype SpecDirty = NonNullable<SpecCheckout[\"dirty\"]>;\ntype SpecWorkflow = NonNullable<AISpecRuntimeValue[\"workflow\"]>;\ntype SpecCommit = NonNullable<SpecWorkflow[\"commits\"]>[number];\ntype SpecBudget = NonNullable<AISpecRuntimeValue[\"budget\"]>;\n\nexport function withRoot(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeValue>,\n): AISpecRuntimeValue {\n return { ...value, ...patch };\n}\n\n// Sets a top-level scalar, deleting the key entirely when cleared so the\n// compacted payload omits it instead of carrying an empty string/undefined.\nexport function withOptionalRoot(\n value: AISpecRuntimeValue,\n key: keyof AISpecRuntimeValue,\n next: unknown,\n): AISpecRuntimeValue {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as AISpecRuntimeValue;\n}\n\nexport function withPrompt(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimePrompt>,\n): AISpecRuntimeValue {\n return withRoot(value, { prompt: { ...value.prompt, ...patch } });\n}\n\nexport function withBudget(\n value: AISpecRuntimeValue,\n budget: SpecBudget,\n): AISpecRuntimeValue {\n return withRoot(value, { budget });\n}\n\nexport function withBudgetValue(\n value: AISpecRuntimeValue,\n key: keyof SpecBudget,\n next: number | string | undefined,\n): AISpecRuntimeValue {\n const budget = { ...value.budget } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete budget[key];\n } else {\n budget[key] = next;\n }\n return withRoot(value, { budget: budget as SpecBudget });\n}\n\nexport function withMemory(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeMemory>,\n): AISpecRuntimeValue {\n return withRoot(value, { memory: { ...value.memory, ...patch } });\n}\n\nexport function withPermissions(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimePermissions>,\n): AISpecRuntimeValue {\n return withRoot(value, { permissions: { ...value.permissions, ...patch } });\n}\n\n/**\n * Reads the sandbox ref in object form regardless of which form it is stored\n * in, so the section's controls do not each have to re-narrow the union.\n */\nexport function sandboxRef(value: AISpecRuntimeValue): AISpecRuntimeSandbox {\n if (typeof value.sandbox === \"string\") {\n return { mode: value.sandbox.trim() as SpecSandboxMode };\n }\n return value.sandbox ?? {};\n}\n\n/**\n * Patches the unified ref while keeping its object form during editing.\n */\nexport function withSandbox(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandbox>,\n): AISpecRuntimeValue {\n const next: AISpecRuntimeSandbox = { ...sandboxRef(value), ...patch };\n if (!next.mode) {\n throw new Error(\n \"sandbox.mode is required before configuring sandbox settings\",\n );\n }\n return withRoot(value, { sandbox: next });\n}\n\nexport function withSandboxMode(\n value: AISpecRuntimeValue,\n mode: SpecSandboxMode,\n): AISpecRuntimeValue {\n const current = sandboxRef(value);\n if (current.mode === mode) return value;\n return withRoot(value, { sandbox: { mode } });\n}\n\nexport function withSandboxBackend(\n value: AISpecRuntimeValue,\n backend: string,\n): AISpecRuntimeValue {\n const next = { ...sandboxRef(value) };\n const selected = backend.trim();\n if (selected) next.backend = selected;\n else delete next.backend;\n return withRoot(value, { sandbox: next });\n}\n\nexport function withSandboxAgent(\n value: AISpecRuntimeValue,\n agent: string,\n): AISpecRuntimeValue {\n const next = { ...sandboxRef(value) };\n const selected = agent.trim();\n if (selected) next.agent = selected;\n else delete next.agent;\n return withRoot(value, { sandbox: next });\n}\n\n// The base posture is independent of the sandbox (see AISpecRuntimePermissions\n// doc comment), so unlike sandbox settings it deletes cleanly to Unspecified\n// without needing a mode to be configured first.\nexport function withPermissionMode(\n value: AISpecRuntimeValue,\n mode: SpecPermissionMode | undefined,\n): AISpecRuntimeValue {\n const next = { ...value.permissions } as AISpecRuntimePermissions;\n if (mode) next.mode = mode;\n else delete next.mode;\n if (Object.keys(next).length === 0) {\n const { permissions: _permissions, ...rest } = value;\n return rest as AISpecRuntimeValue;\n }\n return withRoot(value, { permissions: next });\n}\n\nexport function withSandboxPolicy(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandboxPolicy>,\n): AISpecRuntimeValue {\n if (sandboxRef(value).mode !== \"native\") {\n throw new Error(\"native sandbox policy requires sandbox.mode native\");\n }\n return withSandbox(value, {\n policy: { ...sandboxRef(value).policy, ...patch },\n });\n}\n\nexport function withSandboxDispatch(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandboxDispatch>,\n): AISpecRuntimeValue {\n if (sandboxRef(value).mode !== \"git-agent\") {\n throw new Error(\"sandbox dispatch policy requires sandbox.mode git-agent\");\n }\n return withSandbox(value, {\n dispatch: { ...sandboxRef(value).dispatch, ...patch },\n });\n}\n\nexport function withSetup(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSetup>,\n): AISpecRuntimeValue {\n return withRoot(value, { setup: { ...value.setup, ...patch } });\n}\n\nexport function withConnections(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeConnections>,\n): AISpecRuntimeValue {\n return withSetup(value, {\n connections: { ...value.setup?.connections, ...patch },\n });\n}\n\nexport function withCheckout(\n value: AISpecRuntimeValue,\n patch: SpecCheckout,\n): AISpecRuntimeValue {\n return withSetup(value, {\n checkout: { ...value.setup?.checkout, ...patch },\n });\n}\n\nexport function withWorktree(\n value: AISpecRuntimeValue,\n patch: SpecWorktree,\n): AISpecRuntimeValue {\n return withCheckout(value, {\n worktree: { ...value.setup?.checkout?.worktree, ...patch },\n });\n}\n\nexport function withDirty(\n value: AISpecRuntimeValue,\n patch: SpecDirty,\n): AISpecRuntimeValue {\n return withCheckout(value, {\n dirty: { ...value.setup?.checkout?.dirty, ...patch },\n });\n}\n\nexport function withVerify(\n value: AISpecRuntimeValue,\n patch: NonNullable<SpecWorkflow[\"verify\"]>,\n): AISpecRuntimeValue {\n return withRoot(value, {\n workflow: {\n ...value.workflow,\n verify: { ...value.workflow?.verify, ...patch },\n },\n });\n}\n\n// The editor drives a single commit policy. A spec authored by hand may declare\n// several stanzas; the ones past the first are carried through untouched rather\n// than collapsed away by an edit to a field the editor does surface.\nexport function withCommit(\n value: AISpecRuntimeValue,\n patch: Partial<SpecCommit>,\n): AISpecRuntimeValue {\n const [first, ...rest] = value.workflow?.commits ?? [];\n return withRoot(value, {\n workflow: { ...value.workflow, commits: [{ ...first, ...patch }, ...rest] },\n });\n}\n\n// \"Never\" drops every stanza rather than flagging one off: an absent list is how\n// the spec says \"commit nothing\", and a surviving {dryRun: true} would leave the\n// section reading as configured.\nexport function withCommitPhase(\n value: AISpecRuntimeValue,\n phase: SpecCommitPhase | \"none\",\n): AISpecRuntimeValue {\n if (phase === \"none\") {\n return withRoot(value, { workflow: { ...value.workflow, commits: [] } });\n }\n return withCommit(value, { on: phase });\n}\n\n// A stanza with no explicit phase commits at the end of the run, matching\n// api.Commit.Phase()'s default. Shared between a value's own first commit\n// stanza and an inherited stanza the section displays in its place.\nexport function commitPhaseFromEntry(\n commit: SpecCommit | undefined,\n): SpecCommitPhase {\n const on = commit?.on;\n return on === \"turn\" || on === \"agent\" ? on : \"run\";\n}\n\nexport function commitPhase(\n value: AISpecRuntimeValue,\n): SpecCommitPhase | \"none\" {\n const commits = value.workflow?.commits;\n if (!commits?.length) return \"none\";\n return commitPhaseFromEntry(commits[0]);\n}\n\n// Mode switches clear the fields that no longer apply, so stale values from a\n// previous mode never leak into the compacted payload.\nexport function withCheckoutMode(\n value: AISpecRuntimeValue,\n mode: SpecCheckoutMode,\n): AISpecRuntimeValue {\n if (mode === \"none\") {\n return withCheckout(value, {\n mode,\n url: \"\",\n path: \"\",\n connection: \"\",\n ref: \"\",\n depth: 0,\n });\n }\n if (mode === \"local\")\n return withCheckout(value, { mode, url: \"\", connection: \"\" });\n return withCheckout(value, { mode, path: \"\" });\n}\n\nexport function withWorktreeMode(\n value: AISpecRuntimeValue,\n mode: SpecWorktreeMode,\n): AISpecRuntimeValue {\n if (mode === \"none\") {\n return withWorktree(value, {\n mode,\n prefix: \"\",\n base: \"\",\n path: \"\",\n keep: false,\n });\n }\n const next =\n value.workflow?.commits === undefined\n ? withCommitPhase(value, \"turn\")\n : value;\n if (mode === \"existing\") {\n return withWorktree(next, { mode, prefix: \"\", base: \"\", keep: false });\n }\n return withWorktree(next, { mode });\n}\n\nexport function withStashMode(\n value: AISpecRuntimeValue,\n stash: SpecStashMode,\n): AISpecRuntimeValue {\n return withDirty(value, stash === \"none\" ? { stash, since: \"\" } : { stash });\n}\n\nexport function checkoutMode(value: AISpecRuntimeValue): SpecCheckoutMode {\n const checkout = value.setup?.checkout;\n if (checkout?.mode === \"remote\") return \"remote\";\n if (checkout?.mode === \"local\" || checkout?.path) return \"local\";\n return \"none\";\n}\n\nexport function worktreeMode(value: AISpecRuntimeValue): SpecWorktreeMode {\n const mode = value.setup?.checkout?.worktree?.mode;\n if (mode === \"existing\") return \"existing\";\n if (mode === \"new\") return \"new\";\n return \"none\";\n}\n\nexport function stashMode(value: AISpecRuntimeValue): SpecStashMode {\n const stash = value.setup?.checkout?.dirty?.stash;\n if (\n stash === \"untracked\" ||\n stash === \"unstaged\" ||\n stash === \"staged\" ||\n stash === \"all\"\n ) {\n return stash;\n }\n return \"none\";\n}\n\nexport function parseOptionalNumber(\n value: string,\n integer = false,\n): number | undefined {\n if (value.trim() === \"\") return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) return undefined;\n return integer ? Math.max(0, Math.trunc(parsed)) : parsed;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,7 @@ export declare function withDirty(value: AISpecRuntimeValue, patch: SpecDirty):
|
|
|
35
35
|
export declare function withVerify(value: AISpecRuntimeValue, patch: NonNullable<SpecWorkflow["verify"]>): AISpecRuntimeValue;
|
|
36
36
|
export declare function withCommit(value: AISpecRuntimeValue, patch: Partial<SpecCommit>): AISpecRuntimeValue;
|
|
37
37
|
export declare function withCommitPhase(value: AISpecRuntimeValue, phase: SpecCommitPhase | "none"): AISpecRuntimeValue;
|
|
38
|
+
export declare function commitPhaseFromEntry(commit: SpecCommit | undefined): SpecCommitPhase;
|
|
38
39
|
export declare function commitPhase(value: AISpecRuntimeValue): SpecCommitPhase | "none";
|
|
39
40
|
export declare function withCheckoutMode(value: AISpecRuntimeValue, mode: SpecCheckoutMode): AISpecRuntimeValue;
|
|
40
41
|
export declare function withWorktreeMode(value: AISpecRuntimeValue, mode: SpecWorktreeMode): AISpecRuntimeValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,4BAA4B,EAC5B,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AAEpC,KAAK,YAAY,GAAG,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;AAChE,KAAK,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;AAC1D,KAAK,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,KAAK,YAAY,GAAG,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;AAChE,KAAK,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/D,KAAK,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE5D,wBAAgB,QAAQ,CACtB,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACjC,kBAAkB,CAEpB;AAID,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,MAAM,kBAAkB,EAC7B,IAAI,EAAE,OAAO,GACZ,kBAAkB,CAQpB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAClC,kBAAkB,CAEpB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,UAAU,GACjB,kBAAkB,CAEpB;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,MAAM,UAAU,EACrB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAChC,kBAAkB,CAQpB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAClC,kBAAkB,CAEpB;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACvC,kBAAkB,CAEpB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,oBAAoB,CAK1E;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACnC,kBAAkB,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,9 @@ function sandboxRef(value) {
|
|
|
34
34
|
function withSandbox(value, patch) {
|
|
35
35
|
const next = { ...sandboxRef(value), ...patch };
|
|
36
36
|
if (!next.mode) {
|
|
37
|
-
throw new Error(
|
|
37
|
+
throw new Error(
|
|
38
|
+
"sandbox.mode is required before configuring sandbox settings"
|
|
39
|
+
);
|
|
38
40
|
}
|
|
39
41
|
return withRoot(value, { sandbox: next });
|
|
40
42
|
}
|
|
@@ -112,12 +114,15 @@ function withCommitPhase(value, phase) {
|
|
|
112
114
|
}
|
|
113
115
|
return withCommit(value, { on: phase });
|
|
114
116
|
}
|
|
117
|
+
function commitPhaseFromEntry(commit) {
|
|
118
|
+
const on = commit == null ? void 0 : commit.on;
|
|
119
|
+
return on === "turn" || on === "agent" ? on : "run";
|
|
120
|
+
}
|
|
115
121
|
function commitPhase(value) {
|
|
116
|
-
var _a
|
|
122
|
+
var _a;
|
|
117
123
|
const commits = (_a = value.workflow) == null ? void 0 : _a.commits;
|
|
118
124
|
if (!(commits == null ? void 0 : commits.length)) return "none";
|
|
119
|
-
|
|
120
|
-
return on === "turn" || on === "agent" ? on : "run";
|
|
125
|
+
return commitPhaseFromEntry(commits[0]);
|
|
121
126
|
}
|
|
122
127
|
function withCheckoutMode(value, mode) {
|
|
123
128
|
if (mode === "none") {
|
|
@@ -135,6 +140,7 @@ function withCheckoutMode(value, mode) {
|
|
|
135
140
|
return withCheckout(value, { mode, path: "" });
|
|
136
141
|
}
|
|
137
142
|
function withWorktreeMode(value, mode) {
|
|
143
|
+
var _a;
|
|
138
144
|
if (mode === "none") {
|
|
139
145
|
return withWorktree(value, {
|
|
140
146
|
mode,
|
|
@@ -144,10 +150,11 @@ function withWorktreeMode(value, mode) {
|
|
|
144
150
|
keep: false
|
|
145
151
|
});
|
|
146
152
|
}
|
|
153
|
+
const next = ((_a = value.workflow) == null ? void 0 : _a.commits) === void 0 ? withCommitPhase(value, "turn") : value;
|
|
147
154
|
if (mode === "existing") {
|
|
148
|
-
return withWorktree(
|
|
155
|
+
return withWorktree(next, { mode, prefix: "", base: "", keep: false });
|
|
149
156
|
}
|
|
150
|
-
return withWorktree(
|
|
157
|
+
return withWorktree(next, { mode });
|
|
151
158
|
}
|
|
152
159
|
function checkoutMode(value) {
|
|
153
160
|
var _a;
|
|
@@ -166,6 +173,7 @@ function worktreeMode(value) {
|
|
|
166
173
|
export {
|
|
167
174
|
checkoutMode,
|
|
168
175
|
commitPhase,
|
|
176
|
+
commitPhaseFromEntry,
|
|
169
177
|
sandboxRef,
|
|
170
178
|
withBudgetValue,
|
|
171
179
|
withCheckout,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/update.ts"],"sourcesContent":["import type {\n AISpecRuntimeConnections,\n AISpecRuntimeMemory,\n AISpecRuntimePermissions,\n AISpecRuntimePrompt,\n AISpecRuntimeSandbox,\n AISpecRuntimeSandboxDispatch,\n AISpecRuntimeSandboxPolicy,\n AISpecRuntimeSetup,\n AISpecRuntimeValue,\n SpecCheckoutMode,\n SpecCommitPhase,\n SpecPermissionMode,\n SpecSandboxMode,\n SpecStashMode,\n SpecWorktreeMode,\n} from \"../SpecRuntimeEditor.model\";\n\ntype SpecCheckout = NonNullable<AISpecRuntimeSetup[\"checkout\"]>;\ntype SpecWorktree = NonNullable<SpecCheckout[\"worktree\"]>;\ntype SpecDirty = NonNullable<SpecCheckout[\"dirty\"]>;\ntype SpecWorkflow = NonNullable<AISpecRuntimeValue[\"workflow\"]>;\ntype SpecCommit = NonNullable<SpecWorkflow[\"commits\"]>[number];\ntype SpecBudget = NonNullable<AISpecRuntimeValue[\"budget\"]>;\n\nexport function withRoot(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeValue>,\n): AISpecRuntimeValue {\n return { ...value, ...patch };\n}\n\n// Sets a top-level scalar, deleting the key entirely when cleared so the\n// compacted payload omits it instead of carrying an empty string/undefined.\nexport function withOptionalRoot(\n value: AISpecRuntimeValue,\n key: keyof AISpecRuntimeValue,\n next: unknown,\n): AISpecRuntimeValue {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as AISpecRuntimeValue;\n}\n\nexport function withPrompt(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimePrompt>,\n): AISpecRuntimeValue {\n return withRoot(value, { prompt: { ...value.prompt, ...patch } });\n}\n\nexport function withBudget(\n value: AISpecRuntimeValue,\n budget: SpecBudget,\n): AISpecRuntimeValue {\n return withRoot(value, { budget });\n}\n\nexport function withBudgetValue(\n value: AISpecRuntimeValue,\n key: keyof SpecBudget,\n next: number | string | undefined,\n): AISpecRuntimeValue {\n const budget = { ...value.budget } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete budget[key];\n } else {\n budget[key] = next;\n }\n return withRoot(value, { budget: budget as SpecBudget });\n}\n\nexport function withMemory(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeMemory>,\n): AISpecRuntimeValue {\n return withRoot(value, { memory: { ...value.memory, ...patch } });\n}\n\nexport function withPermissions(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimePermissions>,\n): AISpecRuntimeValue {\n return withRoot(value, { permissions: { ...value.permissions, ...patch } });\n}\n\n/**\n * Reads the sandbox ref in object form regardless of which form it is stored\n * in, so the section's controls do not each have to re-narrow the union.\n */\nexport function sandboxRef(value: AISpecRuntimeValue): AISpecRuntimeSandbox {\n if (typeof value.sandbox === \"string\") {\n return { mode: value.sandbox.trim() as SpecSandboxMode };\n }\n return value.sandbox ?? {};\n}\n\n/**\n * Patches the unified ref while keeping its object form during editing.\n */\nexport function withSandbox(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandbox>,\n): AISpecRuntimeValue {\n const next: AISpecRuntimeSandbox = { ...sandboxRef(value), ...patch };\n if (!next.mode) {\n throw new Error(\"sandbox.mode is required before configuring sandbox settings\");\n }\n return withRoot(value, { sandbox: next });\n}\n\nexport function withSandboxMode(\n value: AISpecRuntimeValue,\n mode: SpecSandboxMode,\n): AISpecRuntimeValue {\n const current = sandboxRef(value);\n if (current.mode === mode) return value;\n return withRoot(value, { sandbox: { mode } });\n}\n\nexport function withSandboxBackend(\n value: AISpecRuntimeValue,\n backend: string,\n): AISpecRuntimeValue {\n const next = { ...sandboxRef(value) };\n const selected = backend.trim();\n if (selected) next.backend = selected;\n else delete next.backend;\n return withRoot(value, { sandbox: next });\n}\n\nexport function withSandboxAgent(\n value: AISpecRuntimeValue,\n agent: string,\n): AISpecRuntimeValue {\n const next = { ...sandboxRef(value) };\n const selected = agent.trim();\n if (selected) next.agent = selected;\n else delete next.agent;\n return withRoot(value, { sandbox: next });\n}\n\n// The base posture is independent of the sandbox (see AISpecRuntimePermissions\n// doc comment), so unlike sandbox settings it deletes cleanly to Unspecified\n// without needing a mode to be configured first.\nexport function withPermissionMode(\n value: AISpecRuntimeValue,\n mode: SpecPermissionMode | undefined,\n): AISpecRuntimeValue {\n const next = { ...value.permissions } as AISpecRuntimePermissions;\n if (mode) next.mode = mode;\n else delete next.mode;\n if (Object.keys(next).length === 0) {\n const { permissions: _permissions, ...rest } = value;\n return rest as AISpecRuntimeValue;\n }\n return withRoot(value, { permissions: next });\n}\n\nexport function withSandboxPolicy(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandboxPolicy>,\n): AISpecRuntimeValue {\n if (sandboxRef(value).mode !== \"native\") {\n throw new Error(\"native sandbox policy requires sandbox.mode native\");\n }\n return withSandbox(value, {\n policy: { ...sandboxRef(value).policy, ...patch },\n });\n}\n\nexport function withSandboxDispatch(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandboxDispatch>,\n): AISpecRuntimeValue {\n if (sandboxRef(value).mode !== \"git-agent\") {\n throw new Error(\"sandbox dispatch policy requires sandbox.mode git-agent\");\n }\n return withSandbox(value, {\n dispatch: { ...sandboxRef(value).dispatch, ...patch },\n });\n}\n\nexport function withSetup(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSetup>,\n): AISpecRuntimeValue {\n return withRoot(value, { setup: { ...value.setup, ...patch } });\n}\n\nexport function withConnections(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeConnections>,\n): AISpecRuntimeValue {\n return withSetup(value, {\n connections: { ...value.setup?.connections, ...patch },\n });\n}\n\nexport function withCheckout(\n value: AISpecRuntimeValue,\n patch: SpecCheckout,\n): AISpecRuntimeValue {\n return withSetup(value, {\n checkout: { ...value.setup?.checkout, ...patch },\n });\n}\n\nexport function withWorktree(\n value: AISpecRuntimeValue,\n patch: SpecWorktree,\n): AISpecRuntimeValue {\n return withCheckout(value, {\n worktree: { ...value.setup?.checkout?.worktree, ...patch },\n });\n}\n\nexport function withDirty(\n value: AISpecRuntimeValue,\n patch: SpecDirty,\n): AISpecRuntimeValue {\n return withCheckout(value, {\n dirty: { ...value.setup?.checkout?.dirty, ...patch },\n });\n}\n\nexport function withVerify(\n value: AISpecRuntimeValue,\n patch: NonNullable<SpecWorkflow[\"verify\"]>,\n): AISpecRuntimeValue {\n return withRoot(value, {\n workflow: {\n ...value.workflow,\n verify: { ...value.workflow?.verify, ...patch },\n },\n });\n}\n\n// The editor drives a single commit policy. A spec authored by hand may declare\n// several stanzas; the ones past the first are carried through untouched rather\n// than collapsed away by an edit to a field the editor does surface.\nexport function withCommit(\n value: AISpecRuntimeValue,\n patch: Partial<SpecCommit>,\n): AISpecRuntimeValue {\n const [first, ...rest] = value.workflow?.commits ?? [];\n return withRoot(value, {\n workflow: { ...value.workflow, commits: [{ ...first, ...patch }, ...rest] },\n });\n}\n\n// \"Never\" drops every stanza rather than flagging one off: an absent list is how\n// the spec says \"commit nothing\", and a surviving {dryRun: true} would leave the\n// section reading as configured.\nexport function withCommitPhase(\n value: AISpecRuntimeValue,\n phase: SpecCommitPhase | \"none\",\n): AISpecRuntimeValue {\n if (phase === \"none\") {\n return withRoot(value, { workflow: { ...value.workflow, commits: [] } });\n }\n return withCommit(value, { on: phase });\n}\n\n// A stanza with no explicit phase commits at the end of the run, matching\n// api.Commit.Phase()'s default.\nexport function commitPhase(\n value: AISpecRuntimeValue,\n): SpecCommitPhase | \"none\" {\n const commits = value.workflow?.commits;\n if (!commits?.length) return \"none\";\n const on = commits[0]?.on;\n return on === \"turn\" || on === \"agent\" ? on : \"run\";\n}\n\n// Mode switches clear the fields that no longer apply, so stale values from a\n// previous mode never leak into the compacted payload.\nexport function withCheckoutMode(\n value: AISpecRuntimeValue,\n mode: SpecCheckoutMode,\n): AISpecRuntimeValue {\n if (mode === \"none\") {\n return withCheckout(value, {\n mode,\n url: \"\",\n path: \"\",\n connection: \"\",\n ref: \"\",\n depth: 0,\n });\n }\n if (mode === \"local\")\n return withCheckout(value, { mode, url: \"\", connection: \"\" });\n return withCheckout(value, { mode, path: \"\" });\n}\n\nexport function withWorktreeMode(\n value: AISpecRuntimeValue,\n mode: SpecWorktreeMode,\n): AISpecRuntimeValue {\n if (mode === \"none\") {\n return withWorktree(value, {\n mode,\n prefix: \"\",\n base: \"\",\n path: \"\",\n keep: false,\n });\n }\n if (mode === \"existing\") {\n return withWorktree(value, { mode, prefix: \"\", base: \"\", keep: false });\n }\n return withWorktree(value, { mode });\n}\n\nexport function withStashMode(\n value: AISpecRuntimeValue,\n stash: SpecStashMode,\n): AISpecRuntimeValue {\n return withDirty(value, stash === \"none\" ? { stash, since: \"\" } : { stash });\n}\n\nexport function checkoutMode(value: AISpecRuntimeValue): SpecCheckoutMode {\n const checkout = value.setup?.checkout;\n if (checkout?.mode === \"remote\") return \"remote\";\n if (checkout?.mode === \"local\" || checkout?.path) return \"local\";\n return \"none\";\n}\n\nexport function worktreeMode(value: AISpecRuntimeValue): SpecWorktreeMode {\n const mode = value.setup?.checkout?.worktree?.mode;\n if (mode === \"existing\") return \"existing\";\n if (mode === \"new\") return \"new\";\n return \"none\";\n}\n\nexport function stashMode(value: AISpecRuntimeValue): SpecStashMode {\n const stash = value.setup?.checkout?.dirty?.stash;\n if (\n stash === \"untracked\" ||\n stash === \"unstaged\" ||\n stash === \"staged\" ||\n stash === \"all\"\n ) {\n return stash;\n }\n return \"none\";\n}\n\nexport function parseOptionalNumber(\n value: string,\n integer = false,\n): number | undefined {\n if (value.trim() === \"\") return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) return undefined;\n return integer ? Math.max(0, Math.trunc(parsed)) : parsed;\n}\n"],"names":[],"mappings":"AAyBO,SAAS,SACd,OACA,OACoB;AACpB,SAAO,EAAE,GAAG,OAAO,GAAG,MAAA;AACxB;AAIO,SAAS,iBACd,OACA,KACA,MACoB;AACpB,QAAM,UAAU,EAAE,GAAG,MAAA;AACrB,MAAI,SAAS,UAAa,SAAS,IAAI;AACrC,WAAO,QAAQ,GAAG;AAAA,EACpB,OAAO;AACL,YAAQ,GAAG,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAEO,SAAS,WACd,OACA,OACoB;AACpB,SAAO,SAAS,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,GAAG,MAAA,GAAS;AAClE;AASO,SAAS,gBACd,OACA,KACA,MACoB;AACpB,QAAM,SAAS,EAAE,GAAG,MAAM,OAAA;AAC1B,MAAI,SAAS,UAAa,SAAS,IAAI;AACrC,WAAO,OAAO,GAAG;AAAA,EACnB,OAAO;AACL,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO,SAAS,OAAO,EAAE,QAA8B;AACzD;AAEO,SAAS,WACd,OACA,OACoB;AACpB,SAAO,SAAS,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,GAAG,MAAA,GAAS;AAClE;AAaO,SAAS,WAAW,OAAiD;AAC1E,MAAI,OAAO,MAAM,YAAY,UAAU;AACrC,WAAO,EAAE,MAAM,MAAM,QAAQ,OAAK;AAAA,EACpC;AACA,SAAO,MAAM,WAAW,CAAA;AAC1B;AAKO,SAAS,YACd,OACA,OACoB;AACpB,QAAM,OAA6B,EAAE,GAAG,WAAW,KAAK,GAAG,GAAG,MAAA;AAC9D,MAAI,CAAC,KAAK,MAAM;AACd,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AACA,SAAO,SAAS,OAAO,EAAE,SAAS,MAAM;AAC1C;AAEO,SAAS,gBACd,OACA,MACoB;AACpB,QAAM,UAAU,WAAW,KAAK;AAChC,MAAI,QAAQ,SAAS,KAAM,QAAO;AAClC,SAAO,SAAS,OAAO,EAAE,SAAS,EAAE,KAAA,GAAQ;AAC9C;AAEO,SAAS,mBACd,OACA,SACoB;AACpB,QAAM,OAAO,EAAE,GAAG,WAAW,KAAK,EAAA;AAClC,QAAM,WAAW,QAAQ,KAAA;AACzB,MAAI,eAAe,UAAU;AAAA,cACjB,KAAK;AACjB,SAAO,SAAS,OAAO,EAAE,SAAS,MAAM;AAC1C;AAEO,SAAS,iBACd,OACA,OACoB;AACpB,QAAM,OAAO,EAAE,GAAG,WAAW,KAAK,EAAA;AAClC,QAAM,WAAW,MAAM,KAAA;AACvB,MAAI,eAAe,QAAQ;AAAA,cACf,KAAK;AACjB,SAAO,SAAS,OAAO,EAAE,SAAS,MAAM;AAC1C;AAKO,SAAS,mBACd,OACA,MACoB;AACpB,QAAM,OAAO,EAAE,GAAG,MAAM,YAAA;AACxB,MAAI,WAAW,OAAO;AAAA,cACV,KAAK;AACjB,MAAI,OAAO,KAAK,IAAI,EAAE,WAAW,GAAG;AAClC,UAAM,EAAE,aAAa,cAAc,GAAG,SAAS;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,SAAS,OAAO,EAAE,aAAa,MAAM;AAC9C;AAcO,SAAS,oBACd,OACA,OACoB;AACpB,MAAI,WAAW,KAAK,EAAE,SAAS,aAAa;AAC1C,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,SAAO,YAAY,OAAO;AAAA,IACxB,UAAU,EAAE,GAAG,WAAW,KAAK,EAAE,UAAU,GAAG,MAAA;AAAA,EAAM,CACrD;AACH;AAEO,SAAS,UACd,OACA,OACoB;AACpB,SAAO,SAAS,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,GAAG,MAAA,GAAS;AAChE;AAWO,SAAS,aACd,OACA,OACoB;AArLf;AAsLL,SAAO,UAAU,OAAO;AAAA,IACtB,UAAU,EAAE,IAAG,WAAM,UAAN,mBAAa,UAAU,GAAG,MAAA;AAAA,EAAM,CAChD;AACH;AAEO,SAAS,aACd,OACA,OACoB;AA9Lf;AA+LL,SAAO,aAAa,OAAO;AAAA,IACzB,UAAU,EAAE,IAAG,iBAAM,UAAN,mBAAa,aAAb,mBAAuB,UAAU,GAAG,MAAA;AAAA,EAAM,CAC1D;AACH;AAWO,SAAS,WACd,OACA,OACoB;AAhNf;AAiNL,SAAO,SAAS,OAAO;AAAA,IACrB,UAAU;AAAA,MACR,GAAG,MAAM;AAAA,MACT,QAAQ,EAAE,IAAG,WAAM,aAAN,mBAAgB,QAAQ,GAAG,MAAA;AAAA,IAAM;AAAA,EAChD,CACD;AACH;AAKO,SAAS,WACd,OACA,OACoB;AA/Nf;AAgOL,QAAM,CAAC,OAAO,GAAG,IAAI,MAAI,WAAM,aAAN,mBAAgB,YAAW,CAAA;AACpD,SAAO,SAAS,OAAO;AAAA,IACrB,UAAU,EAAE,GAAG,MAAM,UAAU,SAAS,CAAC,EAAE,GAAG,OAAO,GAAG,MAAA,GAAS,GAAG,IAAI,EAAA;AAAA,EAAE,CAC3E;AACH;AAKO,SAAS,gBACd,OACA,OACoB;AACpB,MAAI,UAAU,QAAQ;AACpB,WAAO,SAAS,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,UAAU,SAAS,CAAA,EAAC,GAAK;AAAA,EACzE;AACA,SAAO,WAAW,OAAO,EAAE,IAAI,OAAO;AACxC;AAIO,SAAS,YACd,OAC0B;AAvPrB;AAwPL,QAAM,WAAU,WAAM,aAAN,mBAAgB;AAChC,MAAI,EAAC,mCAAS,QAAQ,QAAO;AAC7B,QAAM,MAAK,aAAQ,CAAC,MAAT,mBAAY;AACvB,SAAO,OAAO,UAAU,OAAO,UAAU,KAAK;AAChD;AAIO,SAAS,iBACd,OACA,MACoB;AACpB,MAAI,SAAS,QAAQ;AACnB,WAAO,aAAa,OAAO;AAAA,MACzB;AAAA,MACA,KAAK;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,OAAO;AAAA,IAAA,CACR;AAAA,EACH;AACA,MAAI,SAAS;AACX,WAAO,aAAa,OAAO,EAAE,MAAM,KAAK,IAAI,YAAY,IAAI;AAC9D,SAAO,aAAa,OAAO,EAAE,MAAM,MAAM,IAAI;AAC/C;AAEO,SAAS,iBACd,OACA,MACoB;AACpB,MAAI,SAAS,QAAQ;AACnB,WAAO,aAAa,OAAO;AAAA,MACzB;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IAAA,CACP;AAAA,EACH;AACA,MAAI,SAAS,YAAY;AACvB,WAAO,aAAa,OAAO,EAAE,MAAM,QAAQ,IAAI,MAAM,IAAI,MAAM,OAAO;AAAA,EACxE;AACA,SAAO,aAAa,OAAO,EAAE,MAAM;AACrC;AASO,SAAS,aAAa,OAA6C;AA7SnE;AA8SL,QAAM,YAAW,WAAM,UAAN,mBAAa;AAC9B,OAAI,qCAAU,UAAS,SAAU,QAAO;AACxC,OAAI,qCAAU,UAAS,YAAW,qCAAU,MAAM,QAAO;AACzD,SAAO;AACT;AAEO,SAAS,aAAa,OAA6C;AApTnE;AAqTL,QAAM,QAAO,uBAAM,UAAN,mBAAa,aAAb,mBAAuB,aAAvB,mBAAiC;AAC9C,MAAI,SAAS,WAAY,QAAO;AAChC,MAAI,SAAS,MAAO,QAAO;AAC3B,SAAO;AACT;"}
|
|
1
|
+
{"version":3,"file":"update.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/update.ts"],"sourcesContent":["import type {\n AISpecRuntimeConnections,\n AISpecRuntimeMemory,\n AISpecRuntimePermissions,\n AISpecRuntimePrompt,\n AISpecRuntimeSandbox,\n AISpecRuntimeSandboxDispatch,\n AISpecRuntimeSandboxPolicy,\n AISpecRuntimeSetup,\n AISpecRuntimeValue,\n SpecCheckoutMode,\n SpecCommitPhase,\n SpecPermissionMode,\n SpecSandboxMode,\n SpecStashMode,\n SpecWorktreeMode,\n} from \"../SpecRuntimeEditor.model\";\n\ntype SpecCheckout = NonNullable<AISpecRuntimeSetup[\"checkout\"]>;\ntype SpecWorktree = NonNullable<SpecCheckout[\"worktree\"]>;\ntype SpecDirty = NonNullable<SpecCheckout[\"dirty\"]>;\ntype SpecWorkflow = NonNullable<AISpecRuntimeValue[\"workflow\"]>;\ntype SpecCommit = NonNullable<SpecWorkflow[\"commits\"]>[number];\ntype SpecBudget = NonNullable<AISpecRuntimeValue[\"budget\"]>;\n\nexport function withRoot(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeValue>,\n): AISpecRuntimeValue {\n return { ...value, ...patch };\n}\n\n// Sets a top-level scalar, deleting the key entirely when cleared so the\n// compacted payload omits it instead of carrying an empty string/undefined.\nexport function withOptionalRoot(\n value: AISpecRuntimeValue,\n key: keyof AISpecRuntimeValue,\n next: unknown,\n): AISpecRuntimeValue {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as AISpecRuntimeValue;\n}\n\nexport function withPrompt(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimePrompt>,\n): AISpecRuntimeValue {\n return withRoot(value, { prompt: { ...value.prompt, ...patch } });\n}\n\nexport function withBudget(\n value: AISpecRuntimeValue,\n budget: SpecBudget,\n): AISpecRuntimeValue {\n return withRoot(value, { budget });\n}\n\nexport function withBudgetValue(\n value: AISpecRuntimeValue,\n key: keyof SpecBudget,\n next: number | string | undefined,\n): AISpecRuntimeValue {\n const budget = { ...value.budget } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete budget[key];\n } else {\n budget[key] = next;\n }\n return withRoot(value, { budget: budget as SpecBudget });\n}\n\nexport function withMemory(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeMemory>,\n): AISpecRuntimeValue {\n return withRoot(value, { memory: { ...value.memory, ...patch } });\n}\n\nexport function withPermissions(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimePermissions>,\n): AISpecRuntimeValue {\n return withRoot(value, { permissions: { ...value.permissions, ...patch } });\n}\n\n/**\n * Reads the sandbox ref in object form regardless of which form it is stored\n * in, so the section's controls do not each have to re-narrow the union.\n */\nexport function sandboxRef(value: AISpecRuntimeValue): AISpecRuntimeSandbox {\n if (typeof value.sandbox === \"string\") {\n return { mode: value.sandbox.trim() as SpecSandboxMode };\n }\n return value.sandbox ?? {};\n}\n\n/**\n * Patches the unified ref while keeping its object form during editing.\n */\nexport function withSandbox(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandbox>,\n): AISpecRuntimeValue {\n const next: AISpecRuntimeSandbox = { ...sandboxRef(value), ...patch };\n if (!next.mode) {\n throw new Error(\n \"sandbox.mode is required before configuring sandbox settings\",\n );\n }\n return withRoot(value, { sandbox: next });\n}\n\nexport function withSandboxMode(\n value: AISpecRuntimeValue,\n mode: SpecSandboxMode,\n): AISpecRuntimeValue {\n const current = sandboxRef(value);\n if (current.mode === mode) return value;\n return withRoot(value, { sandbox: { mode } });\n}\n\nexport function withSandboxBackend(\n value: AISpecRuntimeValue,\n backend: string,\n): AISpecRuntimeValue {\n const next = { ...sandboxRef(value) };\n const selected = backend.trim();\n if (selected) next.backend = selected;\n else delete next.backend;\n return withRoot(value, { sandbox: next });\n}\n\nexport function withSandboxAgent(\n value: AISpecRuntimeValue,\n agent: string,\n): AISpecRuntimeValue {\n const next = { ...sandboxRef(value) };\n const selected = agent.trim();\n if (selected) next.agent = selected;\n else delete next.agent;\n return withRoot(value, { sandbox: next });\n}\n\n// The base posture is independent of the sandbox (see AISpecRuntimePermissions\n// doc comment), so unlike sandbox settings it deletes cleanly to Unspecified\n// without needing a mode to be configured first.\nexport function withPermissionMode(\n value: AISpecRuntimeValue,\n mode: SpecPermissionMode | undefined,\n): AISpecRuntimeValue {\n const next = { ...value.permissions } as AISpecRuntimePermissions;\n if (mode) next.mode = mode;\n else delete next.mode;\n if (Object.keys(next).length === 0) {\n const { permissions: _permissions, ...rest } = value;\n return rest as AISpecRuntimeValue;\n }\n return withRoot(value, { permissions: next });\n}\n\nexport function withSandboxPolicy(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandboxPolicy>,\n): AISpecRuntimeValue {\n if (sandboxRef(value).mode !== \"native\") {\n throw new Error(\"native sandbox policy requires sandbox.mode native\");\n }\n return withSandbox(value, {\n policy: { ...sandboxRef(value).policy, ...patch },\n });\n}\n\nexport function withSandboxDispatch(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSandboxDispatch>,\n): AISpecRuntimeValue {\n if (sandboxRef(value).mode !== \"git-agent\") {\n throw new Error(\"sandbox dispatch policy requires sandbox.mode git-agent\");\n }\n return withSandbox(value, {\n dispatch: { ...sandboxRef(value).dispatch, ...patch },\n });\n}\n\nexport function withSetup(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeSetup>,\n): AISpecRuntimeValue {\n return withRoot(value, { setup: { ...value.setup, ...patch } });\n}\n\nexport function withConnections(\n value: AISpecRuntimeValue,\n patch: Partial<AISpecRuntimeConnections>,\n): AISpecRuntimeValue {\n return withSetup(value, {\n connections: { ...value.setup?.connections, ...patch },\n });\n}\n\nexport function withCheckout(\n value: AISpecRuntimeValue,\n patch: SpecCheckout,\n): AISpecRuntimeValue {\n return withSetup(value, {\n checkout: { ...value.setup?.checkout, ...patch },\n });\n}\n\nexport function withWorktree(\n value: AISpecRuntimeValue,\n patch: SpecWorktree,\n): AISpecRuntimeValue {\n return withCheckout(value, {\n worktree: { ...value.setup?.checkout?.worktree, ...patch },\n });\n}\n\nexport function withDirty(\n value: AISpecRuntimeValue,\n patch: SpecDirty,\n): AISpecRuntimeValue {\n return withCheckout(value, {\n dirty: { ...value.setup?.checkout?.dirty, ...patch },\n });\n}\n\nexport function withVerify(\n value: AISpecRuntimeValue,\n patch: NonNullable<SpecWorkflow[\"verify\"]>,\n): AISpecRuntimeValue {\n return withRoot(value, {\n workflow: {\n ...value.workflow,\n verify: { ...value.workflow?.verify, ...patch },\n },\n });\n}\n\n// The editor drives a single commit policy. A spec authored by hand may declare\n// several stanzas; the ones past the first are carried through untouched rather\n// than collapsed away by an edit to a field the editor does surface.\nexport function withCommit(\n value: AISpecRuntimeValue,\n patch: Partial<SpecCommit>,\n): AISpecRuntimeValue {\n const [first, ...rest] = value.workflow?.commits ?? [];\n return withRoot(value, {\n workflow: { ...value.workflow, commits: [{ ...first, ...patch }, ...rest] },\n });\n}\n\n// \"Never\" drops every stanza rather than flagging one off: an absent list is how\n// the spec says \"commit nothing\", and a surviving {dryRun: true} would leave the\n// section reading as configured.\nexport function withCommitPhase(\n value: AISpecRuntimeValue,\n phase: SpecCommitPhase | \"none\",\n): AISpecRuntimeValue {\n if (phase === \"none\") {\n return withRoot(value, { workflow: { ...value.workflow, commits: [] } });\n }\n return withCommit(value, { on: phase });\n}\n\n// A stanza with no explicit phase commits at the end of the run, matching\n// api.Commit.Phase()'s default. Shared between a value's own first commit\n// stanza and an inherited stanza the section displays in its place.\nexport function commitPhaseFromEntry(\n commit: SpecCommit | undefined,\n): SpecCommitPhase {\n const on = commit?.on;\n return on === \"turn\" || on === \"agent\" ? on : \"run\";\n}\n\nexport function commitPhase(\n value: AISpecRuntimeValue,\n): SpecCommitPhase | \"none\" {\n const commits = value.workflow?.commits;\n if (!commits?.length) return \"none\";\n return commitPhaseFromEntry(commits[0]);\n}\n\n// Mode switches clear the fields that no longer apply, so stale values from a\n// previous mode never leak into the compacted payload.\nexport function withCheckoutMode(\n value: AISpecRuntimeValue,\n mode: SpecCheckoutMode,\n): AISpecRuntimeValue {\n if (mode === \"none\") {\n return withCheckout(value, {\n mode,\n url: \"\",\n path: \"\",\n connection: \"\",\n ref: \"\",\n depth: 0,\n });\n }\n if (mode === \"local\")\n return withCheckout(value, { mode, url: \"\", connection: \"\" });\n return withCheckout(value, { mode, path: \"\" });\n}\n\nexport function withWorktreeMode(\n value: AISpecRuntimeValue,\n mode: SpecWorktreeMode,\n): AISpecRuntimeValue {\n if (mode === \"none\") {\n return withWorktree(value, {\n mode,\n prefix: \"\",\n base: \"\",\n path: \"\",\n keep: false,\n });\n }\n const next =\n value.workflow?.commits === undefined\n ? withCommitPhase(value, \"turn\")\n : value;\n if (mode === \"existing\") {\n return withWorktree(next, { mode, prefix: \"\", base: \"\", keep: false });\n }\n return withWorktree(next, { mode });\n}\n\nexport function withStashMode(\n value: AISpecRuntimeValue,\n stash: SpecStashMode,\n): AISpecRuntimeValue {\n return withDirty(value, stash === \"none\" ? { stash, since: \"\" } : { stash });\n}\n\nexport function checkoutMode(value: AISpecRuntimeValue): SpecCheckoutMode {\n const checkout = value.setup?.checkout;\n if (checkout?.mode === \"remote\") return \"remote\";\n if (checkout?.mode === \"local\" || checkout?.path) return \"local\";\n return \"none\";\n}\n\nexport function worktreeMode(value: AISpecRuntimeValue): SpecWorktreeMode {\n const mode = value.setup?.checkout?.worktree?.mode;\n if (mode === \"existing\") return \"existing\";\n if (mode === \"new\") return \"new\";\n return \"none\";\n}\n\nexport function stashMode(value: AISpecRuntimeValue): SpecStashMode {\n const stash = value.setup?.checkout?.dirty?.stash;\n if (\n stash === \"untracked\" ||\n stash === \"unstaged\" ||\n stash === \"staged\" ||\n stash === \"all\"\n ) {\n return stash;\n }\n return \"none\";\n}\n\nexport function parseOptionalNumber(\n value: string,\n integer = false,\n): number | undefined {\n if (value.trim() === \"\") return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) return undefined;\n return integer ? Math.max(0, Math.trunc(parsed)) : parsed;\n}\n"],"names":[],"mappings":"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"}
|