@flanksource/clicky-ui 0.3.34 → 0.3.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- 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.d.ts +1 -1
- package/dist/comments/CommentProvider.d.ts +1 -1
- package/dist/comments/CommentThread.d.ts +1 -1
- package/dist/comments/CommentThreadList.d.ts +1 -1
- package/dist/comments/MentionTextarea.d.ts +1 -1
- package/dist/comments/comment-context.d.ts +4 -4
- package/dist/comments/comment-fixtures.d.ts +1 -1
- package/dist/comments/comment-types.d.ts +1 -1
- package/dist/components/AccordionList.d.ts +1 -1
- package/dist/components/ComboboxControl.d.ts +1 -1
- package/dist/components/ComboboxMenu.d.ts +2 -2
- package/dist/components/ComboboxTags.cjs +41 -11
- package/dist/components/ComboboxTags.cjs.map +1 -1
- package/dist/components/ComboboxTags.d.ts +6 -0
- package/dist/components/ComboboxTags.d.ts.map +1 -1
- package/dist/components/ComboboxTags.js +41 -11
- package/dist/components/ComboboxTags.js.map +1 -1
- package/dist/components/DateField.d.ts +3 -3
- package/dist/components/DatePicker.d.ts +3 -3
- package/dist/components/DateTimePicker.d.ts +3 -3
- package/dist/components/ErrorWrapper.d.ts +2 -2
- package/dist/components/Field.d.ts +1 -1
- package/dist/components/FilterBar.d.ts +1 -1
- package/dist/components/FormLookupProvider.d.ts +1 -1
- package/dist/components/FormatOptionsDropdown.d.ts +1 -1
- package/dist/components/IconButton.d.ts +3 -3
- package/dist/components/InputField.d.ts +2 -2
- package/dist/components/ItemActions.d.ts +1 -1
- package/dist/components/JsonSchemaForm.cjs +17 -36
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +17 -36
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/ListMenu.d.ts +1 -1
- package/dist/components/MultiSelect.d.ts +1 -1
- package/dist/components/SearchInput.d.ts +1 -1
- package/dist/components/SegmentedControl.d.ts +1 -1
- package/dist/components/SplitButton.d.ts +1 -1
- package/dist/components/Switch.d.ts +1 -1
- package/dist/components/TreePickerField.cjs +11 -2
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts +13 -4
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +11 -2
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/UnitStepControls.d.ts +1 -1
- package/dist/components/button.d.ts +3 -3
- package/dist/components/combobox-types.d.ts +1 -1
- package/dist/components/density-switcher.d.ts +1 -1
- package/dist/components/filter-bar-context.d.ts +1 -1
- package/dist/components/filter-bar-field-utils.d.ts +2 -2
- package/dist/components/form-lookup-context.d.ts +1 -1
- package/dist/components/icon-menu-picker.d.ts +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +44 -21
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-accordion-array.js +47 -24
- package/dist/components/json-schema-form-accordion-array.js.map +1 -1
- package/dist/components/json-schema-form-array.cjs +53 -30
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +54 -31
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-cards-array.cjs +32 -22
- package/dist/components/json-schema-form-cards-array.cjs.map +1 -1
- package/dist/components/json-schema-form-cards-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-cards-array.js +33 -23
- package/dist/components/json-schema-form-cards-array.js.map +1 -1
- package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts +44 -0
- package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts.map +1 -0
- package/dist/components/json-schema-form-discriminator.d.ts +1 -1
- package/dist/components/json-schema-form-errors.cjs +5 -1
- package/dist/components/json-schema-form-errors.cjs.map +1 -1
- package/dist/components/json-schema-form-errors.d.ts +2 -1
- package/dist/components/json-schema-form-errors.d.ts.map +1 -1
- package/dist/components/json-schema-form-errors.js +6 -2
- package/dist/components/json-schema-form-errors.js.map +1 -1
- package/dist/components/json-schema-form-extensions.d.ts +1 -1
- package/dist/components/json-schema-form-filter-input.cjs +50 -0
- package/dist/components/json-schema-form-filter-input.cjs.map +1 -0
- package/dist/components/json-schema-form-filter-input.d.ts +5 -0
- package/dist/components/json-schema-form-filter-input.d.ts.map +1 -0
- package/dist/components/json-schema-form-filter-input.js +50 -0
- package/dist/components/json-schema-form-filter-input.js.map +1 -0
- package/dist/components/json-schema-form-filter.cjs +49 -0
- package/dist/components/json-schema-form-filter.cjs.map +1 -0
- package/dist/components/json-schema-form-filter.d.ts +8 -0
- package/dist/components/json-schema-form-filter.d.ts.map +1 -0
- package/dist/components/json-schema-form-filter.js +49 -0
- package/dist/components/json-schema-form-filter.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +84 -17
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +1 -1
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +84 -17
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-list-array.cjs +16 -5
- package/dist/components/json-schema-form-list-array.cjs.map +1 -1
- package/dist/components/json-schema-form-list-array.d.ts +2 -1
- package/dist/components/json-schema-form-list-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-list-array.js +16 -5
- package/dist/components/json-schema-form-list-array.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +239 -85
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts +2 -2
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +241 -87
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-preferences.cjs +1 -1
- package/dist/components/json-schema-form-preferences.cjs.map +1 -1
- package/dist/components/json-schema-form-preferences.d.ts +1 -1
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
- package/dist/components/json-schema-form-preferences.js +1 -1
- package/dist/components/json-schema-form-preferences.js.map +1 -1
- package/dist/components/json-schema-form-properties-errors.fixtures.d.ts +14 -0
- package/dist/components/json-schema-form-properties-errors.fixtures.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties-size.cjs +19 -0
- package/dist/components/json-schema-form-properties-size.cjs.map +1 -0
- package/dist/components/json-schema-form-properties-size.d.ts +4 -0
- package/dist/components/json-schema-form-properties-size.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties-size.js +19 -0
- package/dist/components/json-schema-form-properties-size.js.map +1 -0
- package/dist/components/json-schema-form-properties.cjs +305 -0
- package/dist/components/json-schema-form-properties.cjs.map +1 -0
- package/dist/components/json-schema-form-properties.d.ts +20 -0
- package/dist/components/json-schema-form-properties.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties.fixtures.d.ts +157 -0
- package/dist/components/json-schema-form-properties.fixtures.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties.js +305 -0
- package/dist/components/json-schema-form-properties.js.map +1 -0
- package/dist/components/json-schema-form-property-actions-context.cjs +6 -0
- package/dist/components/json-schema-form-property-actions-context.cjs.map +1 -0
- package/dist/components/json-schema-form-property-actions-context.d.ts +2 -0
- package/dist/components/json-schema-form-property-actions-context.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-actions-context.js +6 -0
- package/dist/components/json-schema-form-property-actions-context.js.map +1 -0
- package/dist/components/json-schema-form-property-collection.cjs +31 -0
- package/dist/components/json-schema-form-property-collection.cjs.map +1 -0
- package/dist/components/json-schema-form-property-collection.d.ts +6 -0
- package/dist/components/json-schema-form-property-collection.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-collection.js +31 -0
- package/dist/components/json-schema-form-property-collection.js.map +1 -0
- package/dist/components/json-schema-form-property-draft.cjs +45 -0
- package/dist/components/json-schema-form-property-draft.cjs.map +1 -0
- package/dist/components/json-schema-form-property-draft.d.ts +8 -0
- package/dist/components/json-schema-form-property-draft.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-draft.js +45 -0
- package/dist/components/json-schema-form-property-draft.js.map +1 -0
- package/dist/components/json-schema-form-property-preview.cjs +68 -0
- package/dist/components/json-schema-form-property-preview.cjs.map +1 -0
- package/dist/components/json-schema-form-property-preview.d.ts +7 -0
- package/dist/components/json-schema-form-property-preview.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-preview.js +68 -0
- package/dist/components/json-schema-form-property-preview.js.map +1 -0
- package/dist/components/json-schema-form-property-selection.cjs +89 -0
- package/dist/components/json-schema-form-property-selection.cjs.map +1 -0
- package/dist/components/json-schema-form-property-selection.d.ts +6 -0
- package/dist/components/json-schema-form-property-selection.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-selection.js +89 -0
- package/dist/components/json-schema-form-property-selection.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +41 -4
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +42 -5
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +2 -0
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +2 -0
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +222 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-table-array.cjs +82 -51
- package/dist/components/json-schema-form-table-array.cjs.map +1 -1
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.js +84 -53
- package/dist/components/json-schema-form-table-array.js.map +1 -1
- package/dist/components/json-schema-form-template-menu.d.ts +1 -1
- package/dist/components/json-schema-form-template.d.ts +1 -1
- package/dist/components/json-schema-form-types.d.ts +7 -179
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +10 -9
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +11 -1
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +10 -9
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/loading.d.ts +4 -4
- package/dist/components/mdx-editor-callout.d.ts +1 -1
- package/dist/components/mdx-editor-options.d.ts +1 -1
- package/dist/components/select.d.ts +3 -3
- package/dist/components/theme-switcher.d.ts +1 -1
- package/dist/components/use-list-menu-selection.d.ts +1 -1
- package/dist/components/useComboboxLayout.d.ts +1 -1
- package/dist/components/workload-picker-utils.d.ts +1 -1
- package/dist/data/Avatar.d.ts +1 -1
- package/dist/data/AvatarBadge.d.ts +1 -1
- package/dist/data/Badge.d.ts +1 -1
- package/dist/data/Callout.d.ts +1 -1
- package/dist/data/DataTable.cjs +575 -435
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +21 -13
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.d.ts +1 -1
- package/dist/data/DataTable.js +575 -435
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/ExecutionTree.d.ts +1 -1
- package/dist/data/FilterPill.d.ts +1 -1
- package/dist/data/FixtureEditor/RawFenceEditor.d.ts +1 -1
- package/dist/data/FixtureEditor/types.d.ts +1 -1
- package/dist/data/Gauge.d.ts +1 -1
- package/dist/data/GaugeHoverCard.d.ts +1 -1
- package/dist/data/Icon.d.ts +1 -1
- package/dist/data/KeyValueList.d.ts +1 -1
- package/dist/data/MarkdownEditor.d.ts +1 -1
- package/dist/data/MatrixTable.d.ts +1 -1
- package/dist/data/ObjectGraph.d.ts +1 -1
- package/dist/data/ProgressBars.d.ts +1 -1
- package/dist/data/Properties.cjs +86 -35
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.d.ts +2 -2
- package/dist/data/Properties.d.ts.map +1 -1
- package/dist/data/Properties.js +87 -36
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/RadialGauge.d.ts +1 -1
- package/dist/data/SchemaViewer.d.ts +1 -1
- package/dist/data/SortableHeader.d.ts +1 -1
- package/dist/data/StatStrip.d.ts +1 -1
- package/dist/data/StatusBreakdown.d.ts +1 -1
- package/dist/data/TabButton.d.ts +1 -1
- package/dist/data/TaskHeaderExtras.cjs +35 -0
- package/dist/data/TaskHeaderExtras.cjs.map +1 -0
- package/dist/data/TaskHeaderExtras.d.ts +27 -0
- package/dist/data/TaskHeaderExtras.d.ts.map +1 -0
- package/dist/data/TaskHeaderExtras.js +35 -0
- package/dist/data/TaskHeaderExtras.js.map +1 -0
- package/dist/data/TaskManager.cjs +27 -23
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts +13 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +27 -23
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +17 -34
- package/dist/data/TaskManagerButton.cjs.map +1 -1
- package/dist/data/TaskManagerButton.d.ts.map +1 -1
- package/dist/data/TaskManagerButton.js +18 -35
- package/dist/data/TaskManagerButton.js.map +1 -1
- package/dist/data/TaskProcessDetails.cjs +7 -25
- package/dist/data/TaskProcessDetails.cjs.map +1 -1
- package/dist/data/TaskProcessDetails.d.ts +2 -1
- package/dist/data/TaskProcessDetails.d.ts.map +1 -1
- package/dist/data/TaskProcessDetails.js +7 -25
- package/dist/data/TaskProcessDetails.js.map +1 -1
- package/dist/data/TaskProcessMetadata.cjs +50 -0
- package/dist/data/TaskProcessMetadata.cjs.map +1 -0
- package/dist/data/TaskProcessMetadata.d.ts +20 -0
- package/dist/data/TaskProcessMetadata.d.ts.map +1 -0
- package/dist/data/TaskProcessMetadata.js +50 -0
- package/dist/data/TaskProcessMetadata.js.map +1 -0
- package/dist/data/TaskProgress.cjs +41 -41
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +15 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +41 -41
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskResourceReadings.cjs +42 -0
- package/dist/data/TaskResourceReadings.cjs.map +1 -0
- package/dist/data/TaskResourceReadings.d.ts +6 -0
- package/dist/data/TaskResourceReadings.d.ts.map +1 -0
- package/dist/data/TaskResourceReadings.js +42 -0
- package/dist/data/TaskResourceReadings.js.map +1 -0
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +36 -1
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/TaskStreamTabs.cjs +78 -0
- package/dist/data/TaskStreamTabs.cjs.map +1 -0
- package/dist/data/TaskStreamTabs.d.ts +35 -0
- package/dist/data/TaskStreamTabs.d.ts.map +1 -0
- package/dist/data/TaskStreamTabs.js +78 -0
- package/dist/data/TaskStreamTabs.js.map +1 -0
- package/dist/data/Timeline.d.ts +1 -1
- package/dist/data/Tree.d.ts +1 -1
- package/dist/data/TreeGroupHeader.d.ts +1 -1
- package/dist/data/TreeNode.d.ts +1 -1
- package/dist/data/Version.d.ts +3 -3
- package/dist/data/ai/ChatWindow.cjs +22 -12
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +22 -12
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts +4 -2
- package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.types.d.ts +1 -1
- package/dist/data/ai/ChatWindowManager.cjs +2 -0
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.js +2 -0
- package/dist/data/ai/ChatWindowManager.js.map +1 -1
- package/dist/data/ai/PolicyTree.d.ts +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts +1 -1
- package/dist/data/ai/PromptCatalog/types.d.ts +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +4 -0
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +5 -2
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +4 -0
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/SessionChatComposer.d.ts +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.cjs +9 -0
- package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.approvals-model.d.ts +17 -0
- package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.approvals-model.js +9 -0
- package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -0
- package/dist/data/ai/SessionInspector.approvals.cjs +143 -0
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.approvals.d.ts +13 -0
- package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.approvals.js +143 -0
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -0
- package/dist/data/ai/SessionInspector.cjs +21 -8
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.d.ts +6 -2
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.d.ts +1 -1
- package/dist/data/ai/SessionInspector.js +21 -8
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.panel-parts.cjs +34 -0
- package/dist/data/ai/SessionInspector.panel-parts.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.panel-parts.d.ts +19 -0
- package/dist/data/ai/SessionInspector.panel-parts.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.panel-parts.js +34 -0
- package/dist/data/ai/SessionInspector.panel-parts.js.map +1 -0
- package/dist/data/ai/SessionInspector.panel-values.cjs +18 -0
- package/dist/data/ai/SessionInspector.panel-values.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.panel-values.d.ts +13 -0
- package/dist/data/ai/SessionInspector.panel-values.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.panel-values.js +18 -0
- package/dist/data/ai/SessionInspector.panel-values.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +41 -99
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panels.d.ts +3 -1
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.panels.js +13 -71
- package/dist/data/ai/SessionInspector.panels.js.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +1 -1
- package/dist/data/ai/SessionViewer.tool-details.d.ts +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +23 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/Footer.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/Rail.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/SectionCard.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs +3 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +3 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js +3 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +3 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +5 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +3 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/chat-window-context.cjs +1 -0
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +13 -5
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +1 -0
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/index.d.ts +3 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +1 -1
- package/dist/data/cache-browser/adapter.d.ts +1 -1
- package/dist/data/cells/CellFilterActions.d.ts +1 -1
- package/dist/data/cells/EntityCell.d.ts +1 -1
- package/dist/data/cells/tag-utils.d.ts +1 -1
- package/dist/data/chat/Chat.cjs +42 -46
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +16 -5
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +43 -47
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ModelSelector.d.ts +1 -1
- package/dist/data/chat/PromptInput.cjs +13 -0
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +8 -2
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +14 -1
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/chat/tool-render/ToolArgs.d.ts +1 -1
- package/dist/data/chat/tool-render/ToolParams.d.ts +1 -1
- package/dist/data/chat/tool-render/ToolValue.d.ts +1 -1
- package/dist/data/chat/tool-render/adapter.d.ts +1 -1
- package/dist/data/chat/tool-render/context.d.ts +1 -1
- package/dist/data/chat/tool-render/defaults.d.ts +1 -1
- package/dist/data/chat/tool-render/known-tool-views.d.ts +1 -1
- package/dist/data/chat/tool-render/summary.d.ts +1 -1
- package/dist/data/chat/types.d.ts +1 -1
- package/dist/data/clicky-export/useClickyExport.d.ts +1 -1
- package/dist/data/data-table-server-filters.d.ts +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +1 -1
- package/dist/data/diagnostics/StackFrameRow.d.ts +1 -1
- package/dist/data/git/GitChangeList.d.ts +1 -1
- package/dist/data/icon-fallback.d.ts +1 -1
- package/dist/data/properties-context.cjs +6 -0
- package/dist/data/properties-context.cjs.map +1 -0
- package/dist/data/properties-context.d.ts +7 -0
- package/dist/data/properties-context.d.ts.map +1 -0
- package/dist/data/properties-context.js +6 -0
- package/dist/data/properties-context.js.map +1 -0
- package/dist/data/query-browser/QueryBrowser.types.d.ts +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +7 -3
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +7 -3
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/task-copy.cjs +1 -1
- package/dist/data/task-copy.cjs.map +1 -1
- package/dist/data/task-copy.js +1 -1
- package/dist/data/task-copy.js.map +1 -1
- package/dist/data/task-metadata.cjs +36 -0
- package/dist/data/task-metadata.cjs.map +1 -0
- package/dist/data/task-metadata.d.ts +39 -0
- package/dist/data/task-metadata.d.ts.map +1 -0
- package/dist/data/task-metadata.js +36 -0
- package/dist/data/task-metadata.js.map +1 -0
- package/dist/data/task-resource-summary.cjs +30 -0
- package/dist/data/task-resource-summary.cjs.map +1 -0
- package/dist/data/task-resource-summary.d.ts +15 -0
- package/dist/data/task-resource-summary.d.ts.map +1 -0
- package/dist/data/task-resource-summary.js +30 -0
- package/dist/data/task-resource-summary.js.map +1 -0
- package/dist/data/task-status.cjs +8 -2
- package/dist/data/task-status.cjs.map +1 -1
- package/dist/data/task-status.d.ts +3 -0
- package/dist/data/task-status.d.ts.map +1 -1
- package/dist/data/task-status.js +8 -2
- package/dist/data/task-status.js.map +1 -1
- package/dist/data/task-streams.cjs +39 -0
- package/dist/data/task-streams.cjs.map +1 -0
- package/dist/data/task-streams.d.ts +60 -0
- package/dist/data/task-streams.d.ts.map +1 -0
- package/dist/data/task-streams.js +39 -0
- package/dist/data/task-streams.js.map +1 -0
- package/dist/data/task-work-progress.cjs +24 -0
- package/dist/data/task-work-progress.cjs.map +1 -0
- package/dist/data/task-work-progress.d.ts +21 -0
- package/dist/data/task-work-progress.d.ts.map +1 -0
- package/dist/data/task-work-progress.js +24 -0
- package/dist/data/task-work-progress.js.map +1 -0
- package/dist/data/test-runner/TestRunner.d.ts +1 -1
- package/dist/data/test-runner/adapter.d.ts +1 -1
- package/dist/data/test-runner/context.d.ts +1 -1
- package/dist/data/use-data-table-virtual.cjs +73 -0
- package/dist/data/use-data-table-virtual.cjs.map +1 -0
- package/dist/data/use-data-table-virtual.d.ts +40 -0
- package/dist/data/use-data-table-virtual.d.ts.map +1 -0
- package/dist/data/use-data-table-virtual.js +73 -0
- package/dist/data/use-data-table-virtual.js.map +1 -0
- package/dist/data/verification/VerificationResults.d.ts +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +14 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +14 -0
- package/dist/data.js.map +1 -1
- package/dist/expressions/lang/attributes.cjs +56 -0
- package/dist/expressions/lang/attributes.cjs.map +1 -0
- package/dist/expressions/lang/attributes.d.ts +22 -0
- package/dist/expressions/lang/attributes.d.ts.map +1 -0
- package/dist/expressions/lang/attributes.js +56 -0
- package/dist/expressions/lang/attributes.js.map +1 -0
- package/dist/expressions/lang/completion.cjs +164 -0
- package/dist/expressions/lang/completion.cjs.map +1 -0
- package/dist/expressions/lang/completion.d.ts +29 -0
- package/dist/expressions/lang/completion.d.ts.map +1 -0
- package/dist/expressions/lang/completion.js +164 -0
- package/dist/expressions/lang/completion.js.map +1 -0
- package/dist/expressions/lang/environment.cjs +115 -0
- package/dist/expressions/lang/environment.cjs.map +1 -0
- package/dist/expressions/lang/environment.d.ts +54 -0
- package/dist/expressions/lang/environment.d.ts.map +1 -0
- package/dist/expressions/lang/environment.js +115 -0
- package/dist/expressions/lang/environment.js.map +1 -0
- package/dist/expressions/lang/generated/conformance.json.d.ts +4962 -0
- package/dist/expressions/lang/generated/index.cjs +18 -0
- package/dist/expressions/lang/generated/index.cjs.map +1 -0
- package/dist/expressions/lang/generated/index.d.ts +9 -0
- package/dist/expressions/lang/generated/index.d.ts.map +1 -0
- package/dist/expressions/lang/generated/index.js +18 -0
- package/dist/expressions/lang/generated/index.js.map +1 -0
- package/dist/expressions/lang/generated/languages.json.cjs +18 -0
- package/dist/expressions/lang/generated/languages.json.cjs.map +1 -0
- package/dist/expressions/lang/generated/languages.json.d.ts +2305 -0
- package/dist/expressions/lang/generated/languages.json.js +18 -0
- package/dist/expressions/lang/generated/languages.json.js.map +1 -0
- package/dist/expressions/lang/generated/spec.json.cjs +12 -0
- package/dist/expressions/lang/generated/spec.json.cjs.map +1 -0
- package/dist/expressions/lang/generated/spec.json.d.ts +6260 -0
- package/dist/expressions/lang/generated/spec.json.js +12 -0
- package/dist/expressions/lang/generated/spec.json.js.map +1 -0
- package/dist/expressions/lang/hover.cjs +106 -0
- package/dist/expressions/lang/hover.cjs.map +1 -0
- package/dist/expressions/lang/hover.d.ts +54 -0
- package/dist/expressions/lang/hover.d.ts.map +1 -0
- package/dist/expressions/lang/hover.js +106 -0
- package/dist/expressions/lang/hover.js.map +1 -0
- package/dist/expressions/lang/index.cjs +87 -0
- package/dist/expressions/lang/index.cjs.map +1 -0
- package/dist/expressions/lang/index.d.ts +65 -0
- package/dist/expressions/lang/index.d.ts.map +1 -0
- package/dist/expressions/lang/index.js +90 -0
- package/dist/expressions/lang/index.js.map +1 -0
- package/dist/expressions/lang/merge.cjs +52 -0
- package/dist/expressions/lang/merge.cjs.map +1 -0
- package/dist/expressions/lang/merge.d.ts +12 -0
- package/dist/expressions/lang/merge.d.ts.map +1 -0
- package/dist/expressions/lang/merge.js +52 -0
- package/dist/expressions/lang/merge.js.map +1 -0
- package/dist/expressions/lang/prefix.cjs +91 -0
- package/dist/expressions/lang/prefix.cjs.map +1 -0
- package/dist/expressions/lang/prefix.d.ts +36 -0
- package/dist/expressions/lang/prefix.d.ts.map +1 -0
- package/dist/expressions/lang/prefix.js +91 -0
- package/dist/expressions/lang/prefix.js.map +1 -0
- package/dist/expressions/lang/spec.d.ts +13 -0
- package/dist/expressions/lang/spec.d.ts.map +1 -0
- package/dist/expressions/lang/theme.cjs +97 -0
- package/dist/expressions/lang/theme.cjs.map +1 -0
- package/dist/expressions/lang/theme.d.ts +6 -0
- package/dist/expressions/lang/theme.d.ts.map +1 -0
- package/dist/expressions/lang/theme.js +97 -0
- package/dist/expressions/lang/theme.js.map +1 -0
- package/dist/expressions/lang/types.d.ts +81 -0
- package/dist/expressions/lang/types.d.ts.map +1 -0
- package/dist/expressions/playground/ExpressionPlayground.cjs +308 -0
- package/dist/expressions/playground/ExpressionPlayground.cjs.map +1 -0
- package/dist/expressions/playground/ExpressionPlayground.d.ts +42 -0
- package/dist/expressions/playground/ExpressionPlayground.d.ts.map +1 -0
- package/dist/expressions/playground/ExpressionPlayground.js +291 -0
- package/dist/expressions/playground/ExpressionPlayground.js.map +1 -0
- package/dist/expressions/playground/RunControls.cjs +51 -0
- package/dist/expressions/playground/RunControls.cjs.map +1 -0
- package/dist/expressions/playground/RunControls.d.ts +7 -0
- package/dist/expressions/playground/RunControls.d.ts.map +1 -0
- package/dist/expressions/playground/RunControls.js +51 -0
- package/dist/expressions/playground/RunControls.js.map +1 -0
- package/dist/expressions/playground/VerticalSplit.cjs +109 -0
- package/dist/expressions/playground/VerticalSplit.cjs.map +1 -0
- package/dist/expressions/playground/VerticalSplit.d.ts +23 -0
- package/dist/expressions/playground/VerticalSplit.d.ts.map +1 -0
- package/dist/expressions/playground/VerticalSplit.js +109 -0
- package/dist/expressions/playground/VerticalSplit.js.map +1 -0
- package/dist/expressions/playground/api.cjs +49 -0
- package/dist/expressions/playground/api.cjs.map +1 -0
- package/dist/expressions/playground/api.d.ts +53 -0
- package/dist/expressions/playground/api.d.ts.map +1 -0
- package/dist/expressions/playground/api.js +49 -0
- package/dist/expressions/playground/api.js.map +1 -0
- package/dist/expressions/playground/languages.cjs +88 -0
- package/dist/expressions/playground/languages.cjs.map +1 -0
- package/dist/expressions/playground/languages.d.ts +43 -0
- package/dist/expressions/playground/languages.d.ts.map +1 -0
- package/dist/expressions/playground/languages.js +88 -0
- package/dist/expressions/playground/languages.js.map +1 -0
- package/dist/expressions/playground/panels/GraphPanel.cjs +72 -0
- package/dist/expressions/playground/panels/GraphPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/GraphPanel.d.ts +19 -0
- package/dist/expressions/playground/panels/GraphPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/GraphPanel.js +72 -0
- package/dist/expressions/playground/panels/GraphPanel.js.map +1 -0
- package/dist/expressions/playground/panels/ResultPanel.cjs +82 -0
- package/dist/expressions/playground/panels/ResultPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/ResultPanel.d.ts +11 -0
- package/dist/expressions/playground/panels/ResultPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/ResultPanel.js +82 -0
- package/dist/expressions/playground/panels/ResultPanel.js.map +1 -0
- package/dist/expressions/playground/panels/SpecPanel.cjs +76 -0
- package/dist/expressions/playground/panels/SpecPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/SpecPanel.d.ts +18 -0
- package/dist/expressions/playground/panels/SpecPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/SpecPanel.js +76 -0
- package/dist/expressions/playground/panels/SpecPanel.js.map +1 -0
- package/dist/expressions/playground/panels/TokensPanel.cjs +89 -0
- package/dist/expressions/playground/panels/TokensPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/TokensPanel.d.ts +15 -0
- package/dist/expressions/playground/panels/TokensPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/TokensPanel.js +72 -0
- package/dist/expressions/playground/panels/TokensPanel.js.map +1 -0
- package/dist/expressions/playground/panels/graphNodes.cjs +35 -0
- package/dist/expressions/playground/panels/graphNodes.cjs.map +1 -0
- package/dist/expressions/playground/panels/graphNodes.d.ts +19 -0
- package/dist/expressions/playground/panels/graphNodes.d.ts.map +1 -0
- package/dist/expressions/playground/panels/graphNodes.js +35 -0
- package/dist/expressions/playground/panels/graphNodes.js.map +1 -0
- package/dist/expressions/playground/runAction.cjs +12 -0
- package/dist/expressions/playground/runAction.cjs.map +1 -0
- package/dist/expressions/playground/runAction.d.ts +15 -0
- package/dist/expressions/playground/runAction.d.ts.map +1 -0
- package/dist/expressions/playground/runAction.js +12 -0
- package/dist/expressions/playground/runAction.js.map +1 -0
- package/dist/expressions/playground/runShortcut.cjs +9 -0
- package/dist/expressions/playground/runShortcut.cjs.map +1 -0
- package/dist/expressions/playground/runShortcut.d.ts +2 -0
- package/dist/expressions/playground/runShortcut.d.ts.map +1 -0
- package/dist/expressions/playground/runShortcut.js +9 -0
- package/dist/expressions/playground/runShortcut.js.map +1 -0
- package/dist/expressions/playground/useEditorTheme.cjs +40 -0
- package/dist/expressions/playground/useEditorTheme.cjs.map +1 -0
- package/dist/expressions/playground/useEditorTheme.d.ts +16 -0
- package/dist/expressions/playground/useEditorTheme.d.ts.map +1 -0
- package/dist/expressions/playground/useEditorTheme.js +23 -0
- package/dist/expressions/playground/useEditorTheme.js.map +1 -0
- package/dist/expressions/playground/useEvaluator.cjs +72 -0
- package/dist/expressions/playground/useEvaluator.cjs.map +1 -0
- package/dist/expressions/playground/useEvaluator.d.ts +25 -0
- package/dist/expressions/playground/useEvaluator.d.ts.map +1 -0
- package/dist/expressions/playground/useEvaluator.js +72 -0
- package/dist/expressions/playground/useEvaluator.js.map +1 -0
- package/dist/expressions/playground/useParsedInput.cjs +22 -0
- package/dist/expressions/playground/useParsedInput.cjs.map +1 -0
- package/dist/expressions/playground/useParsedInput.d.ts +20 -0
- package/dist/expressions/playground/useParsedInput.d.ts.map +1 -0
- package/dist/expressions/playground/useParsedInput.js +22 -0
- package/dist/expressions/playground/useParsedInput.js.map +1 -0
- package/dist/expressions/playground/verticalSplitModel.cjs +11 -0
- package/dist/expressions/playground/verticalSplitModel.cjs.map +1 -0
- package/dist/expressions/playground/verticalSplitModel.d.ts +3 -0
- package/dist/expressions/playground/verticalSplitModel.d.ts.map +1 -0
- package/dist/expressions/playground/verticalSplitModel.js +11 -0
- package/dist/expressions/playground/verticalSplitModel.js.map +1 -0
- package/dist/expressions/playground.cjs +18 -0
- package/dist/expressions/playground.cjs.map +1 -0
- package/dist/expressions/playground.d.ts +18 -0
- package/dist/expressions/playground.d.ts.map +1 -0
- package/dist/expressions/playground.js +18 -0
- package/dist/expressions/playground.js.map +1 -0
- package/dist/expressions.cjs +28 -0
- package/dist/expressions.cjs.map +1 -0
- package/dist/expressions.d.ts +10 -0
- package/dist/expressions.d.ts.map +1 -0
- package/dist/expressions.js +28 -0
- package/dist/expressions.js.map +1 -0
- package/dist/hooks/density-provider.d.ts +1 -1
- package/dist/hooks/theme-provider.d.ts +1 -1
- package/dist/hooks/use-density.d.ts +1 -1
- package/dist/hooks/use-resource-clock.cjs +14 -0
- package/dist/hooks/use-resource-clock.cjs.map +1 -0
- package/dist/hooks/use-resource-clock.d.ts +2 -0
- package/dist/hooks/use-resource-clock.d.ts.map +1 -0
- package/dist/hooks/use-resource-clock.js +14 -0
- package/dist/hooks/use-resource-clock.js.map +1 -0
- package/dist/hooks/use-task-run.cjs +25 -18
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +26 -19
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks/use-theme.d.ts +1 -1
- package/dist/icons/registry.d.ts +1 -1
- package/dist/icons/types.d.ts +1 -1
- package/dist/index.cjs +14 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.d.ts +1 -1
- package/dist/layout/AppShell.nav.drag.d.ts +1 -1
- package/dist/layout/AppSidebar.d.ts +1 -1
- package/dist/layout/Panel.d.ts +1 -1
- package/dist/layout/PanelFrame.d.ts +1 -1
- package/dist/layout/Section.d.ts +1 -1
- package/dist/layout/SplitPane.d.ts +1 -1
- package/dist/layout/Tabs.d.ts +1 -1
- package/dist/layout/Workspace.d.ts +1 -1
- package/dist/layout/Workspace.model.d.ts +1 -1
- package/dist/lib/combobox-values.d.ts +1 -1
- package/dist/monaco/MonacoEditor.cjs +3 -3
- package/dist/monaco/MonacoEditor.cjs.map +1 -1
- package/dist/monaco/MonacoEditor.js +2 -2
- package/dist/monaco/MonacoEditor.js.map +1 -1
- package/dist/monaco/types.d.ts +1 -1
- package/dist/monaco/use-monaco-worker.d.ts +1 -1
- package/dist/overlay/CellActions.d.ts +1 -1
- package/dist/overlay/CommandPalette.d.ts +2 -2
- package/dist/overlay/CommandPalette.model.d.ts +1 -1
- package/dist/overlay/CommandPaletteList.d.ts +1 -1
- package/dist/overlay/DropdownMenu.d.ts +1 -1
- package/dist/overlay/HoverCard.d.ts +1 -1
- package/dist/overlay/Modal.d.ts +2 -2
- package/dist/overlay/Toast.d.ts +1 -1
- package/dist/overlay/TourCard.d.ts +1 -1
- package/dist/overlay/TourProvider.d.ts +1 -1
- package/dist/overlay/dropdownMenuContext.d.ts +1 -1
- package/dist/overlay/toast-context.d.ts +2 -2
- package/dist/overlay/tour-context.d.ts +1 -1
- package/dist/overlay/tour-types.d.ts +1 -1
- package/dist/profiles/connections/connectionBrowserModel.d.ts +1 -1
- package/dist/profiles/connections/connectionQueryWorkspace.d.ts +1 -1
- package/dist/profiles/editor/profileBuilder.d.ts +1 -1
- package/dist/profiles/elasticsearch/esParamOperandExtension.d.ts +1 -1
- package/dist/profiles/fields/profileFieldControls.d.ts +1 -1
- package/dist/profiles/fields/profileFieldIcons.d.ts +1 -1
- package/dist/profiles/fields/profileFieldState.d.ts +1 -1
- package/dist/profiles/query/jsonPathSample.d.ts +1 -1
- package/dist/profiles/query/jsonPathSampleRow.d.ts +1 -1
- package/dist/profiles/query/prometheusResults.d.ts +2 -2
- package/dist/rpc/EndpointList.d.ts +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts +1 -1
- package/dist/rpc/OperationCatalog.d.ts +1 -1
- package/dist/rpc/OperationEntityContextPicker.d.ts +1 -1
- package/dist/rpc/OperationEntityPage.d.ts +1 -1
- package/dist/rpc/OperationResultView.d.ts +1 -1
- package/dist/rpc/RouterProvider.d.ts +1 -1
- package/dist/rpc/SchemaActionForm.d.ts +1 -1
- package/dist/rpc/formMetadata.d.ts +1 -1
- package/dist/rpc/router.d.ts +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts +1 -1
- package/dist/styles.css +1 -1
- package/package.json +21 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuntimeBar.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AASjE,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAChC;gFAC4E;IAC5E,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,EACpD,KAAK,EACL,QAAQ,EACR,OAAqB,EACrB,MAAW,EACX,QAAgC,EAChC,aAAa,EACb,cAAc,EACd,gBAA4C,EAC5C,MAAc,EACd,SAAgB,EAChB,UAAiB,EACjB,SAAqB,EACrB,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,+
|
|
1
|
+
{"version":3,"file":"RuntimeBar.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AASjE,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAChC;gFAC4E;IAC5E,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,EACpD,KAAK,EACL,QAAQ,EACR,OAAqB,EACrB,MAAW,EACX,QAAgC,EAChC,aAAa,EACb,cAAc,EACd,gBAA4C,EAC5C,MAAc,EACd,SAAgB,EAChB,UAAiB,EACjB,SAAqB,EACrB,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,+BA0HpB"}
|
|
@@ -24,12 +24,16 @@ function RuntimeBar({
|
|
|
24
24
|
className
|
|
25
25
|
}) {
|
|
26
26
|
var _a;
|
|
27
|
-
const [
|
|
27
|
+
const [preference, setPreference] = useState({ model: effectiveModel, family: void 0 });
|
|
28
|
+
if (preference.model !== effectiveModel) {
|
|
29
|
+
setPreference({ model: effectiveModel, family: void 0 });
|
|
30
|
+
}
|
|
31
|
+
const preferredFamily = preference.model === effectiveModel ? preference.family : void 0;
|
|
28
32
|
const specMode = runtimeModeFromModel(value.model) || ((_a = value.mode) == null ? void 0 : _a.trim()) || (effectiveMode == null ? void 0 : effectiveMode.trim());
|
|
29
33
|
const selection = selectionForRuntime(
|
|
30
34
|
families,
|
|
31
35
|
specMode,
|
|
32
|
-
value.model || effectiveModel,
|
|
36
|
+
value.model || (preferredFamily ? void 0 : effectiveModel),
|
|
33
37
|
models,
|
|
34
38
|
preferredFamily
|
|
35
39
|
);
|
|
@@ -45,7 +49,7 @@ function RuntimeBar({
|
|
|
45
49
|
reasoningEfforts
|
|
46
50
|
);
|
|
47
51
|
const applyMode = (familyId, modeId) => {
|
|
48
|
-
|
|
52
|
+
setPreference({ model: effectiveModel, family: familyId });
|
|
49
53
|
const next = applyRuntimeMode(
|
|
50
54
|
value,
|
|
51
55
|
models,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuntimeBar.js","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { applyRuntimeMode, runtimeModelForValue } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n familyById,\n firstMode,\n modelsForFamily,\n selectionForRuntime,\n runtimeModeFromModel,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode shown when the editable value inherits it from another layer. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family without persisting it. */\n effectiveModel?: string | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, mode, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n /** Whether the selected runtime exposes a model argument. */\n showModel?: boolean | undefined;\n /** Whether the selected runtime exposes reasoning effort. */\n showEffort?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n effectiveMode,\n effectiveModel,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n showModel = true,\n showEffort = true,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const [
|
|
1
|
+
{"version":3,"file":"RuntimeBar.js","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { applyRuntimeMode, runtimeModelForValue } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n familyById,\n firstMode,\n modelsForFamily,\n selectionForRuntime,\n runtimeModeFromModel,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode shown when the editable value inherits it from another layer. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family without persisting it. */\n effectiveModel?: string | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, mode, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n /** Whether the selected runtime exposes a model argument. */\n showModel?: boolean | undefined;\n /** Whether the selected runtime exposes reasoning effort. */\n showEffort?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n effectiveMode,\n effectiveModel,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n showModel = true,\n showEffort = true,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const [preference, setPreference] = useState<{\n model: string | undefined;\n family: string | undefined;\n }>({ model: effectiveModel, family: undefined });\n if (preference.model !== effectiveModel) {\n setPreference({ model: effectiveModel, family: undefined });\n }\n const preferredFamily = preference.model === effectiveModel ? preference.family : undefined;\n const specMode =\n runtimeModeFromModel(value.model) ||\n value.mode?.trim() ||\n effectiveMode?.trim();\n const selection = selectionForRuntime(\n families,\n specMode,\n value.model || (preferredFamily ? undefined : effectiveModel),\n models,\n preferredFamily,\n );\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, specMode);\n const resolvedModel = runtimeModelForValue(models, value, isSelectableModel);\n const selectedModelUnavailable = Boolean(\n !resolvedModel &&\n (value.id || value.model) &&\n runtimeModelForValue(models, value, (entry) => !isSelectableModel(entry)),\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts,\n );\n\n const applyMode = (familyId: string, modeId: string) => {\n setPreference({ model: effectiveModel, family: familyId });\n const next = applyRuntimeMode(\n value,\n models,\n families,\n familyId,\n modeId,\n reasoningEfforts,\n );\n if (next !== value) onChange(next);\n };\n\n const applyCustomModel = (model: string) => {\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model),\n );\n };\n // A family's model catalog can serve several modes. Selecting a row must not\n // silently move the user away from the mode they chose.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(\n withoutCatalogModel(value),\n model,\n reasoningEfforts,\n { mode: mode.id },\n );\n onChange(next);\n };\n const clearModel = () => {\n onChange(withoutCatalogModel(value));\n };\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyMode(familyId, selection.mode)}\n onModeChange={(modeId) => applyMode(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onModeChange={applyMode}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined,\n );\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown,\n): T {\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 T;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/data/task-copy.cjs
CHANGED
|
@@ -37,7 +37,7 @@ function groupHeader(group, tasks) {
|
|
|
37
37
|
const counts = taskStatus.bucketTasks(tasks);
|
|
38
38
|
const total = group.total ?? tasks.length;
|
|
39
39
|
const summary = [`status: ${group.status}`];
|
|
40
|
-
if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail}/${total}`);
|
|
40
|
+
if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail + counts.canceled}/${total}`);
|
|
41
41
|
if (group.kind) summary.push(`kind: ${group.kind}`);
|
|
42
42
|
const lines = [`# ${group.name}`, summary.join(" · ")];
|
|
43
43
|
const labels = Object.entries(group.labels ?? {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-copy.cjs","sources":["../../src/data/task-copy.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { bucketTasks } from \"./task-status\";\n\n// Builders that flatten a task run into pasteable text. Deliberately free of\n// React and of the clipboard so the exact output is unit-testable, and so the\n// rendered card and the copied text cannot drift apart.\n\n// isFailedOrWarn marks the statuses TaskGroupCard always keeps visible. Also\n// drives \"copy errors only\", so the two can never disagree.\nexport function isFailedOrWarn(t: TaskSnapshot): boolean {\n return (\n t.status === \"failed\" || t.status === \"FAIL\" || t.status === \"ERR\" || t.status === \"warning\"\n );\n}\n\n// A task counts as errored for copy purposes when it either rests in a failing\n// status or carries an error string (a canceled dependency does the latter).\nfunction isErrored(t: TaskSnapshot): boolean {\n return isFailedOrWarn(t) || Boolean(t.error);\n}\n\nexport function taskGroupErrorCount(tasks: TaskSnapshot[]): number {\n return tasks.filter(isErrored).length;\n}\n\nfunction fence(label: string, body: string, language = \"\"): string[] {\n return [`${label}:`, \"```\" + language, body.replace(/\\n+$/, \"\"), \"```\"];\n}\n\nfunction streamBlock(label: string, text: string, truncated: boolean | undefined): string[] {\n // Mirrors the \"showing latest 1 MiB\" note TaskStream renders.\n return fence(truncated ? `${label} (showing latest 1 MiB)` : label, text);\n}\n\nfunction taskSection(t: TaskSnapshot): string[] {\n const lines = [`## ${t.name} — ${t.status}${t.duration ? ` (${t.duration})` : \"\"}`];\n if (t.description) lines.push(t.description);\n if (t.error) lines.push(`error: ${t.error}`);\n // `message` carries the latest log line; only worth repeating when it differs.\n if (t.message && t.message !== t.error) lines.push(`message: ${t.message}`);\n const logs = t.logs ?? [];\n if (logs.length > 0) {\n lines.push(\"logs:\");\n for (const l of logs) lines.push(` ${l.level} ${l.message}`);\n }\n if (t.stdout) lines.push(...streamBlock(\"stdout\", t.stdout, t.stdoutTruncated));\n if (t.stderr) lines.push(...streamBlock(\"stderr\", t.stderr, t.stderrTruncated));\n // `details` is an open shape (TaskExecDetails carries arbitrary domain keys),\n // so serialize it whole rather than narrowing to a known variant.\n if (t.details !== undefined) {\n lines.push(...fence(\"details\", JSON.stringify(t.details, null, 2), \"json\"));\n }\n return lines;\n}\n\nfunction groupHeader(group: TaskSnapshot, tasks: TaskSnapshot[]): string[] {\n const counts = bucketTasks(tasks);\n const total = group.total ?? tasks.length;\n const summary = [`status: ${group.status}`];\n if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail}/${total}`);\n if (group.kind) summary.push(`kind: ${group.kind}`);\n\n const lines = [`# ${group.name}`, summary.join(\" · \")];\n const labels = Object.entries(group.labels ?? {});\n if (labels.length > 0) {\n lines.push(`labels: ${labels.map(([k, v]) => `${k}=${v}`).join(\", \")}`);\n }\n const timing: string[] = [];\n if (group.startedAt) timing.push(`started ${group.startedAt}`);\n if (group.finishedAt) timing.push(`finished ${group.finishedAt}`);\n if (timing.length > 0) lines.push(timing.join(\" · \"));\n if (group.error) lines.push(`error: ${group.error}`);\n return lines;\n}\n\nfunction joinBlocks(blocks: string[][]): string {\n return `${blocks.map((block) => block.join(\"\\n\")).join(\"\\n\\n\")}\\n`;\n}\n\n/** The whole run — group context followed by every task, with logs, streams and details. */\nexport function taskGroupMarkdown(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.map(taskSection)]);\n}\n\n/** Group context followed by only the failing/warning tasks. */\nexport function taskGroupErrors(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.filter(isErrored).map(taskSection)]);\n}\n\n/** The raw snapshots, for feeding a tool rather than a human. */\nexport function taskGroupJson(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return JSON.stringify({ group, tasks }, null, 2);\n}\n\n/** A single task, for the per-row copy affordance. */\nexport function taskMarkdown(task: TaskSnapshot): string {\n return joinBlocks([taskSection(task)]);\n}\n"],"names":["bucketTasks"],"mappings":";;;AASO,SAAS,eAAe,GAA0B;AACvD,SACE,EAAE,WAAW,YAAY,EAAE,WAAW,UAAU,EAAE,WAAW,SAAS,EAAE,WAAW;AAEvF;AAIA,SAAS,UAAU,GAA0B;AAC3C,SAAO,eAAe,CAAC,KAAK,QAAQ,EAAE,KAAK;AAC7C;AAEO,SAAS,oBAAoB,OAA+B;AACjE,SAAO,MAAM,OAAO,SAAS,EAAE;AACjC;AAEA,SAAS,MAAM,OAAe,MAAc,WAAW,IAAc;AACnE,SAAO,CAAC,GAAG,KAAK,KAAK,QAAQ,UAAU,KAAK,QAAQ,QAAQ,EAAE,GAAG,KAAK;AACxE;AAEA,SAAS,YAAY,OAAe,MAAc,WAA0C;AAE1F,SAAO,MAAM,YAAY,GAAG,KAAK,4BAA4B,OAAO,IAAI;AAC1E;AAEA,SAAS,YAAY,GAA2B;AAC9C,QAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,MAAM,EAAE,MAAM,GAAG,EAAE,WAAW,KAAK,EAAE,QAAQ,MAAM,EAAE,EAAE;AAClF,MAAI,EAAE,YAAa,OAAM,KAAK,EAAE,WAAW;AAC3C,MAAI,EAAE,MAAO,OAAM,KAAK,UAAU,EAAE,KAAK,EAAE;AAE3C,MAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAO,OAAM,KAAK,YAAY,EAAE,OAAO,EAAE;AAC1E,QAAM,OAAO,EAAE,QAAQ,CAAA;AACvB,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM,KAAK,OAAO;AAClB,eAAW,KAAK,KAAM,OAAM,KAAK,KAAK,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE;AAAA,EAC9D;AACA,MAAI,EAAE,OAAQ,OAAM,KAAK,GAAG,YAAY,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC;AAC9E,MAAI,EAAE,OAAQ,OAAM,KAAK,GAAG,YAAY,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC;AAG9E,MAAI,EAAE,YAAY,QAAW;AAC3B,UAAM,KAAK,GAAG,MAAM,WAAW,KAAK,UAAU,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAqB,OAAiC;AACzE,QAAM,SAASA,WAAAA,YAAY,KAAK;AAChC,QAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,QAAM,UAAU,CAAC,WAAW,MAAM,MAAM,EAAE;AAC1C,MAAI,QAAQ,EAAG,SAAQ,KAAK,GAAG,OAAO,KAAK,OAAO,OAAO,OAAO,
|
|
1
|
+
{"version":3,"file":"task-copy.cjs","sources":["../../src/data/task-copy.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { bucketTasks } from \"./task-status\";\n\n// Builders that flatten a task run into pasteable text. Deliberately free of\n// React and of the clipboard so the exact output is unit-testable, and so the\n// rendered card and the copied text cannot drift apart.\n\n// isFailedOrWarn marks the statuses TaskGroupCard always keeps visible. Also\n// drives \"copy errors only\", so the two can never disagree.\nexport function isFailedOrWarn(t: TaskSnapshot): boolean {\n return (\n t.status === \"failed\" || t.status === \"FAIL\" || t.status === \"ERR\" || t.status === \"warning\"\n );\n}\n\n// A task counts as errored for copy purposes when it either rests in a failing\n// status or carries an error string (a canceled dependency does the latter).\nfunction isErrored(t: TaskSnapshot): boolean {\n return isFailedOrWarn(t) || Boolean(t.error);\n}\n\nexport function taskGroupErrorCount(tasks: TaskSnapshot[]): number {\n return tasks.filter(isErrored).length;\n}\n\nfunction fence(label: string, body: string, language = \"\"): string[] {\n return [`${label}:`, \"```\" + language, body.replace(/\\n+$/, \"\"), \"```\"];\n}\n\nfunction streamBlock(label: string, text: string, truncated: boolean | undefined): string[] {\n // Mirrors the \"showing latest 1 MiB\" note TaskStream renders.\n return fence(truncated ? `${label} (showing latest 1 MiB)` : label, text);\n}\n\nfunction taskSection(t: TaskSnapshot): string[] {\n const lines = [`## ${t.name} — ${t.status}${t.duration ? ` (${t.duration})` : \"\"}`];\n if (t.description) lines.push(t.description);\n if (t.error) lines.push(`error: ${t.error}`);\n // `message` carries the latest log line; only worth repeating when it differs.\n if (t.message && t.message !== t.error) lines.push(`message: ${t.message}`);\n const logs = t.logs ?? [];\n if (logs.length > 0) {\n lines.push(\"logs:\");\n for (const l of logs) lines.push(` ${l.level} ${l.message}`);\n }\n if (t.stdout) lines.push(...streamBlock(\"stdout\", t.stdout, t.stdoutTruncated));\n if (t.stderr) lines.push(...streamBlock(\"stderr\", t.stderr, t.stderrTruncated));\n // `details` is an open shape (TaskExecDetails carries arbitrary domain keys),\n // so serialize it whole rather than narrowing to a known variant.\n if (t.details !== undefined) {\n lines.push(...fence(\"details\", JSON.stringify(t.details, null, 2), \"json\"));\n }\n return lines;\n}\n\nfunction groupHeader(group: TaskSnapshot, tasks: TaskSnapshot[]): string[] {\n const counts = bucketTasks(tasks);\n const total = group.total ?? tasks.length;\n const summary = [`status: ${group.status}`];\n if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail + counts.canceled}/${total}`);\n if (group.kind) summary.push(`kind: ${group.kind}`);\n\n const lines = [`# ${group.name}`, summary.join(\" · \")];\n const labels = Object.entries(group.labels ?? {});\n if (labels.length > 0) {\n lines.push(`labels: ${labels.map(([k, v]) => `${k}=${v}`).join(\", \")}`);\n }\n const timing: string[] = [];\n if (group.startedAt) timing.push(`started ${group.startedAt}`);\n if (group.finishedAt) timing.push(`finished ${group.finishedAt}`);\n if (timing.length > 0) lines.push(timing.join(\" · \"));\n if (group.error) lines.push(`error: ${group.error}`);\n return lines;\n}\n\nfunction joinBlocks(blocks: string[][]): string {\n return `${blocks.map((block) => block.join(\"\\n\")).join(\"\\n\\n\")}\\n`;\n}\n\n/** The whole run — group context followed by every task, with logs, streams and details. */\nexport function taskGroupMarkdown(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.map(taskSection)]);\n}\n\n/** Group context followed by only the failing/warning tasks. */\nexport function taskGroupErrors(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.filter(isErrored).map(taskSection)]);\n}\n\n/** The raw snapshots, for feeding a tool rather than a human. */\nexport function taskGroupJson(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return JSON.stringify({ group, tasks }, null, 2);\n}\n\n/** A single task, for the per-row copy affordance. */\nexport function taskMarkdown(task: TaskSnapshot): string {\n return joinBlocks([taskSection(task)]);\n}\n"],"names":["bucketTasks"],"mappings":"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"}
|
package/dist/data/task-copy.js
CHANGED
|
@@ -35,7 +35,7 @@ function groupHeader(group, tasks) {
|
|
|
35
35
|
const counts = bucketTasks(tasks);
|
|
36
36
|
const total = group.total ?? tasks.length;
|
|
37
37
|
const summary = [`status: ${group.status}`];
|
|
38
|
-
if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail}/${total}`);
|
|
38
|
+
if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail + counts.canceled}/${total}`);
|
|
39
39
|
if (group.kind) summary.push(`kind: ${group.kind}`);
|
|
40
40
|
const lines = [`# ${group.name}`, summary.join(" · ")];
|
|
41
41
|
const labels = Object.entries(group.labels ?? {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-copy.js","sources":["../../src/data/task-copy.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { bucketTasks } from \"./task-status\";\n\n// Builders that flatten a task run into pasteable text. Deliberately free of\n// React and of the clipboard so the exact output is unit-testable, and so the\n// rendered card and the copied text cannot drift apart.\n\n// isFailedOrWarn marks the statuses TaskGroupCard always keeps visible. Also\n// drives \"copy errors only\", so the two can never disagree.\nexport function isFailedOrWarn(t: TaskSnapshot): boolean {\n return (\n t.status === \"failed\" || t.status === \"FAIL\" || t.status === \"ERR\" || t.status === \"warning\"\n );\n}\n\n// A task counts as errored for copy purposes when it either rests in a failing\n// status or carries an error string (a canceled dependency does the latter).\nfunction isErrored(t: TaskSnapshot): boolean {\n return isFailedOrWarn(t) || Boolean(t.error);\n}\n\nexport function taskGroupErrorCount(tasks: TaskSnapshot[]): number {\n return tasks.filter(isErrored).length;\n}\n\nfunction fence(label: string, body: string, language = \"\"): string[] {\n return [`${label}:`, \"```\" + language, body.replace(/\\n+$/, \"\"), \"```\"];\n}\n\nfunction streamBlock(label: string, text: string, truncated: boolean | undefined): string[] {\n // Mirrors the \"showing latest 1 MiB\" note TaskStream renders.\n return fence(truncated ? `${label} (showing latest 1 MiB)` : label, text);\n}\n\nfunction taskSection(t: TaskSnapshot): string[] {\n const lines = [`## ${t.name} — ${t.status}${t.duration ? ` (${t.duration})` : \"\"}`];\n if (t.description) lines.push(t.description);\n if (t.error) lines.push(`error: ${t.error}`);\n // `message` carries the latest log line; only worth repeating when it differs.\n if (t.message && t.message !== t.error) lines.push(`message: ${t.message}`);\n const logs = t.logs ?? [];\n if (logs.length > 0) {\n lines.push(\"logs:\");\n for (const l of logs) lines.push(` ${l.level} ${l.message}`);\n }\n if (t.stdout) lines.push(...streamBlock(\"stdout\", t.stdout, t.stdoutTruncated));\n if (t.stderr) lines.push(...streamBlock(\"stderr\", t.stderr, t.stderrTruncated));\n // `details` is an open shape (TaskExecDetails carries arbitrary domain keys),\n // so serialize it whole rather than narrowing to a known variant.\n if (t.details !== undefined) {\n lines.push(...fence(\"details\", JSON.stringify(t.details, null, 2), \"json\"));\n }\n return lines;\n}\n\nfunction groupHeader(group: TaskSnapshot, tasks: TaskSnapshot[]): string[] {\n const counts = bucketTasks(tasks);\n const total = group.total ?? tasks.length;\n const summary = [`status: ${group.status}`];\n if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail}/${total}`);\n if (group.kind) summary.push(`kind: ${group.kind}`);\n\n const lines = [`# ${group.name}`, summary.join(\" · \")];\n const labels = Object.entries(group.labels ?? {});\n if (labels.length > 0) {\n lines.push(`labels: ${labels.map(([k, v]) => `${k}=${v}`).join(\", \")}`);\n }\n const timing: string[] = [];\n if (group.startedAt) timing.push(`started ${group.startedAt}`);\n if (group.finishedAt) timing.push(`finished ${group.finishedAt}`);\n if (timing.length > 0) lines.push(timing.join(\" · \"));\n if (group.error) lines.push(`error: ${group.error}`);\n return lines;\n}\n\nfunction joinBlocks(blocks: string[][]): string {\n return `${blocks.map((block) => block.join(\"\\n\")).join(\"\\n\\n\")}\\n`;\n}\n\n/** The whole run — group context followed by every task, with logs, streams and details. */\nexport function taskGroupMarkdown(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.map(taskSection)]);\n}\n\n/** Group context followed by only the failing/warning tasks. */\nexport function taskGroupErrors(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.filter(isErrored).map(taskSection)]);\n}\n\n/** The raw snapshots, for feeding a tool rather than a human. */\nexport function taskGroupJson(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return JSON.stringify({ group, tasks }, null, 2);\n}\n\n/** A single task, for the per-row copy affordance. */\nexport function taskMarkdown(task: TaskSnapshot): string {\n return joinBlocks([taskSection(task)]);\n}\n"],"names":[],"mappings":";AASO,SAAS,eAAe,GAA0B;AACvD,SACE,EAAE,WAAW,YAAY,EAAE,WAAW,UAAU,EAAE,WAAW,SAAS,EAAE,WAAW;AAEvF;AAIA,SAAS,UAAU,GAA0B;AAC3C,SAAO,eAAe,CAAC,KAAK,QAAQ,EAAE,KAAK;AAC7C;AAEO,SAAS,oBAAoB,OAA+B;AACjE,SAAO,MAAM,OAAO,SAAS,EAAE;AACjC;AAEA,SAAS,MAAM,OAAe,MAAc,WAAW,IAAc;AACnE,SAAO,CAAC,GAAG,KAAK,KAAK,QAAQ,UAAU,KAAK,QAAQ,QAAQ,EAAE,GAAG,KAAK;AACxE;AAEA,SAAS,YAAY,OAAe,MAAc,WAA0C;AAE1F,SAAO,MAAM,YAAY,GAAG,KAAK,4BAA4B,OAAO,IAAI;AAC1E;AAEA,SAAS,YAAY,GAA2B;AAC9C,QAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,MAAM,EAAE,MAAM,GAAG,EAAE,WAAW,KAAK,EAAE,QAAQ,MAAM,EAAE,EAAE;AAClF,MAAI,EAAE,YAAa,OAAM,KAAK,EAAE,WAAW;AAC3C,MAAI,EAAE,MAAO,OAAM,KAAK,UAAU,EAAE,KAAK,EAAE;AAE3C,MAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAO,OAAM,KAAK,YAAY,EAAE,OAAO,EAAE;AAC1E,QAAM,OAAO,EAAE,QAAQ,CAAA;AACvB,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM,KAAK,OAAO;AAClB,eAAW,KAAK,KAAM,OAAM,KAAK,KAAK,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE;AAAA,EAC9D;AACA,MAAI,EAAE,OAAQ,OAAM,KAAK,GAAG,YAAY,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC;AAC9E,MAAI,EAAE,OAAQ,OAAM,KAAK,GAAG,YAAY,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC;AAG9E,MAAI,EAAE,YAAY,QAAW;AAC3B,UAAM,KAAK,GAAG,MAAM,WAAW,KAAK,UAAU,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAqB,OAAiC;AACzE,QAAM,SAAS,YAAY,KAAK;AAChC,QAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,QAAM,UAAU,CAAC,WAAW,MAAM,MAAM,EAAE;AAC1C,MAAI,QAAQ,EAAG,SAAQ,KAAK,GAAG,OAAO,KAAK,OAAO,OAAO,OAAO,
|
|
1
|
+
{"version":3,"file":"task-copy.js","sources":["../../src/data/task-copy.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { bucketTasks } from \"./task-status\";\n\n// Builders that flatten a task run into pasteable text. Deliberately free of\n// React and of the clipboard so the exact output is unit-testable, and so the\n// rendered card and the copied text cannot drift apart.\n\n// isFailedOrWarn marks the statuses TaskGroupCard always keeps visible. Also\n// drives \"copy errors only\", so the two can never disagree.\nexport function isFailedOrWarn(t: TaskSnapshot): boolean {\n return (\n t.status === \"failed\" || t.status === \"FAIL\" || t.status === \"ERR\" || t.status === \"warning\"\n );\n}\n\n// A task counts as errored for copy purposes when it either rests in a failing\n// status or carries an error string (a canceled dependency does the latter).\nfunction isErrored(t: TaskSnapshot): boolean {\n return isFailedOrWarn(t) || Boolean(t.error);\n}\n\nexport function taskGroupErrorCount(tasks: TaskSnapshot[]): number {\n return tasks.filter(isErrored).length;\n}\n\nfunction fence(label: string, body: string, language = \"\"): string[] {\n return [`${label}:`, \"```\" + language, body.replace(/\\n+$/, \"\"), \"```\"];\n}\n\nfunction streamBlock(label: string, text: string, truncated: boolean | undefined): string[] {\n // Mirrors the \"showing latest 1 MiB\" note TaskStream renders.\n return fence(truncated ? `${label} (showing latest 1 MiB)` : label, text);\n}\n\nfunction taskSection(t: TaskSnapshot): string[] {\n const lines = [`## ${t.name} — ${t.status}${t.duration ? ` (${t.duration})` : \"\"}`];\n if (t.description) lines.push(t.description);\n if (t.error) lines.push(`error: ${t.error}`);\n // `message` carries the latest log line; only worth repeating when it differs.\n if (t.message && t.message !== t.error) lines.push(`message: ${t.message}`);\n const logs = t.logs ?? [];\n if (logs.length > 0) {\n lines.push(\"logs:\");\n for (const l of logs) lines.push(` ${l.level} ${l.message}`);\n }\n if (t.stdout) lines.push(...streamBlock(\"stdout\", t.stdout, t.stdoutTruncated));\n if (t.stderr) lines.push(...streamBlock(\"stderr\", t.stderr, t.stderrTruncated));\n // `details` is an open shape (TaskExecDetails carries arbitrary domain keys),\n // so serialize it whole rather than narrowing to a known variant.\n if (t.details !== undefined) {\n lines.push(...fence(\"details\", JSON.stringify(t.details, null, 2), \"json\"));\n }\n return lines;\n}\n\nfunction groupHeader(group: TaskSnapshot, tasks: TaskSnapshot[]): string[] {\n const counts = bucketTasks(tasks);\n const total = group.total ?? tasks.length;\n const summary = [`status: ${group.status}`];\n if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail + counts.canceled}/${total}`);\n if (group.kind) summary.push(`kind: ${group.kind}`);\n\n const lines = [`# ${group.name}`, summary.join(\" · \")];\n const labels = Object.entries(group.labels ?? {});\n if (labels.length > 0) {\n lines.push(`labels: ${labels.map(([k, v]) => `${k}=${v}`).join(\", \")}`);\n }\n const timing: string[] = [];\n if (group.startedAt) timing.push(`started ${group.startedAt}`);\n if (group.finishedAt) timing.push(`finished ${group.finishedAt}`);\n if (timing.length > 0) lines.push(timing.join(\" · \"));\n if (group.error) lines.push(`error: ${group.error}`);\n return lines;\n}\n\nfunction joinBlocks(blocks: string[][]): string {\n return `${blocks.map((block) => block.join(\"\\n\")).join(\"\\n\\n\")}\\n`;\n}\n\n/** The whole run — group context followed by every task, with logs, streams and details. */\nexport function taskGroupMarkdown(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.map(taskSection)]);\n}\n\n/** Group context followed by only the failing/warning tasks. */\nexport function taskGroupErrors(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.filter(isErrored).map(taskSection)]);\n}\n\n/** The raw snapshots, for feeding a tool rather than a human. */\nexport function taskGroupJson(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return JSON.stringify({ group, tasks }, null, 2);\n}\n\n/** A single task, for the per-row copy affordance. */\nexport function taskMarkdown(task: TaskSnapshot): string {\n return joinBlocks([taskSection(task)]);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const collections = require("../lib/collections.cjs");
|
|
4
|
+
function isScalar(value) {
|
|
5
|
+
return typeof value === "string" || typeof value === "number" || typeof value === "boolean";
|
|
6
|
+
}
|
|
7
|
+
function metadataEntries(value) {
|
|
8
|
+
if (!collections.isPlainObject(value)) return [];
|
|
9
|
+
const entries = [];
|
|
10
|
+
for (const [key, item] of Object.entries(value)) {
|
|
11
|
+
if (!isScalar(item) || item === "") continue;
|
|
12
|
+
entries.push({ key, value: item, text: String(item) });
|
|
13
|
+
}
|
|
14
|
+
return entries;
|
|
15
|
+
}
|
|
16
|
+
function isFlatMetadata(value) {
|
|
17
|
+
return collections.isPlainObject(value) && Object.values(value).every(isScalar);
|
|
18
|
+
}
|
|
19
|
+
const LINK_KEYS = /* @__PURE__ */ new Set(["href", "url", "link"]);
|
|
20
|
+
const HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;
|
|
21
|
+
const NAVIGABLE_URL = /^https?:\/\//i;
|
|
22
|
+
const OFF_SITE_PATH = /^\/[/\\]/;
|
|
23
|
+
function withoutBlanks(text) {
|
|
24
|
+
let stripped = "";
|
|
25
|
+
for (const character of text) if (character > " ") stripped += character;
|
|
26
|
+
return stripped;
|
|
27
|
+
}
|
|
28
|
+
function isMetadataLink(key, text) {
|
|
29
|
+
if (!LINK_KEYS.has(key) && !text.startsWith("/") && !text.startsWith("https://")) return false;
|
|
30
|
+
const destination = withoutBlanks(text);
|
|
31
|
+
return HAS_SCHEME.test(destination) ? NAVIGABLE_URL.test(destination) : !OFF_SITE_PATH.test(destination);
|
|
32
|
+
}
|
|
33
|
+
exports.isFlatMetadata = isFlatMetadata;
|
|
34
|
+
exports.isMetadataLink = isMetadataLink;
|
|
35
|
+
exports.metadataEntries = metadataEntries;
|
|
36
|
+
//# sourceMappingURL=task-metadata.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-metadata.cjs","sources":["../../src/data/task-metadata.ts"],"sourcesContent":["/**\n * Task metadata is whatever JSON the producer chose to attach to a snapshot, so\n * rendering it starts with reading its shape rather than assuming one. The split\n * these helpers make is between values that read as a label — a state, a model,\n * a session id — and values that do not, because only the first kind can go in a\n * row of chips without turning into `[object Object]`.\n */\n\nimport { isPlainObject } from \"../lib/collections\";\n\n/** A metadata value that renders as one short piece of text. */\nexport type MetadataScalar = string | number | boolean;\n\nexport interface MetadataEntry {\n key: string;\n value: MetadataScalar;\n /** The text to render, and to test for a link. */\n text: string;\n}\n\nfunction isScalar(value: unknown): value is MetadataScalar {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\n/**\n * The scalar entries of a metadata object, in the producer's own key order.\n * Empty strings are dropped: a producer that reports a field it has no value for\n * yet is saying nothing, and a blank chip reads as a rendering fault.\n */\nexport function metadataEntries(value: unknown): MetadataEntry[] {\n if (!isPlainObject(value)) return [];\n const entries: MetadataEntry[] = [];\n for (const [key, item] of Object.entries(value)) {\n if (!isScalar(item) || item === \"\") continue;\n entries.push({ key, value: item, text: String(item) });\n }\n return entries;\n}\n\n/**\n * True when every value in the object is a scalar — the case a chip row or a\n * definition list can render completely, with nothing left over to fall back to\n * a JSON view for.\n */\nexport function isFlatMetadata(value: unknown): boolean {\n return isPlainObject(value) && Object.values(value).every(isScalar);\n}\n\n/** Keys whose value is meant as a destination rather than a label. */\nconst LINK_KEYS = new Set([\"href\", \"url\", \"link\"]);\n\nconst HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;\n\n/** The schemes that only ever navigate. `javascript:` and `data:` run instead. */\nconst NAVIGABLE_URL = /^https?:\\/\\//i;\n\n/** A leading `//` or `/\\` is somewhere else entirely, wearing a path's clothes. */\nconst OFF_SITE_PATH = /^\\/[/\\\\]/;\n\n/** A browser ignores spaces and control characters when reading an href, so a scheme is read from the same stripped form it would see. */\nfunction withoutBlanks(text: string): string {\n let stripped = \"\";\n for (const character of text) if (character > \" \") stripped += character;\n return stripped;\n}\n\n/**\n * Whether a metadata value can be put in an `href`.\n *\n * The key says what the producer meant by a value; it does not say what the\n * value is. Metadata is whatever JSON reached this client over the task API or\n * the SSE stream, so a `url` of `javascript:…` is a script the page would run\n * on click rather than a place it would go. What may be linked is therefore\n * named rather than what may not: a relative reference, or an http(s) URL.\n * Anything else keeps rendering as the plain text it already was.\n */\nexport function isMetadataLink(key: string, text: string): boolean {\n if (!LINK_KEYS.has(key) && !text.startsWith(\"/\") && !text.startsWith(\"https://\")) return false;\n const destination = withoutBlanks(text);\n return HAS_SCHEME.test(destination) ? NAVIGABLE_URL.test(destination) : !OFF_SITE_PATH.test(destination);\n}\n"],"names":["isPlainObject"],"mappings":";;;AAoBA,SAAS,SAAS,OAAyC;AACzD,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU;AACpF;AAOO,SAAS,gBAAgB,OAAiC;AAC/D,MAAI,CAACA,YAAAA,cAAc,KAAK,UAAU,CAAA;AAClC,QAAM,UAA2B,CAAA;AACjC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,CAAC,SAAS,IAAI,KAAK,SAAS,GAAI;AACpC,YAAQ,KAAK,EAAE,KAAK,OAAO,MAAM,MAAM,OAAO,IAAI,GAAG;AAAA,EACvD;AACA,SAAO;AACT;AAOO,SAAS,eAAe,OAAyB;AACtD,SAAOA,YAAAA,cAAc,KAAK,KAAK,OAAO,OAAO,KAAK,EAAE,MAAM,QAAQ;AACpE;AAGA,MAAM,YAAY,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,CAAC;AAEjD,MAAM,aAAa;AAGnB,MAAM,gBAAgB;AAGtB,MAAM,gBAAgB;AAGtB,SAAS,cAAc,MAAsB;AAC3C,MAAI,WAAW;AACf,aAAW,aAAa,KAAM,KAAI,YAAY,IAAK,aAAY;AAC/D,SAAO;AACT;AAYO,SAAS,eAAe,KAAa,MAAuB;AACjE,MAAI,CAAC,UAAU,IAAI,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,UAAU,EAAG,QAAO;AACzF,QAAM,cAAc,cAAc,IAAI;AACtC,SAAO,WAAW,KAAK,WAAW,IAAI,cAAc,KAAK,WAAW,IAAI,CAAC,cAAc,KAAK,WAAW;AACzG;;;;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task metadata is whatever JSON the producer chose to attach to a snapshot, so
|
|
3
|
+
* rendering it starts with reading its shape rather than assuming one. The split
|
|
4
|
+
* these helpers make is between values that read as a label — a state, a model,
|
|
5
|
+
* a session id — and values that do not, because only the first kind can go in a
|
|
6
|
+
* row of chips without turning into `[object Object]`.
|
|
7
|
+
*/
|
|
8
|
+
/** A metadata value that renders as one short piece of text. */
|
|
9
|
+
export type MetadataScalar = string | number | boolean;
|
|
10
|
+
export interface MetadataEntry {
|
|
11
|
+
key: string;
|
|
12
|
+
value: MetadataScalar;
|
|
13
|
+
/** The text to render, and to test for a link. */
|
|
14
|
+
text: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The scalar entries of a metadata object, in the producer's own key order.
|
|
18
|
+
* Empty strings are dropped: a producer that reports a field it has no value for
|
|
19
|
+
* yet is saying nothing, and a blank chip reads as a rendering fault.
|
|
20
|
+
*/
|
|
21
|
+
export declare function metadataEntries(value: unknown): MetadataEntry[];
|
|
22
|
+
/**
|
|
23
|
+
* True when every value in the object is a scalar — the case a chip row or a
|
|
24
|
+
* definition list can render completely, with nothing left over to fall back to
|
|
25
|
+
* a JSON view for.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isFlatMetadata(value: unknown): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Whether a metadata value can be put in an `href`.
|
|
30
|
+
*
|
|
31
|
+
* The key says what the producer meant by a value; it does not say what the
|
|
32
|
+
* value is. Metadata is whatever JSON reached this client over the task API or
|
|
33
|
+
* the SSE stream, so a `url` of `javascript:…` is a script the page would run
|
|
34
|
+
* on click rather than a place it would go. What may be linked is therefore
|
|
35
|
+
* named rather than what may not: a relative reference, or an http(s) URL.
|
|
36
|
+
* Anything else keeps rendering as the plain text it already was.
|
|
37
|
+
*/
|
|
38
|
+
export declare function isMetadataLink(key: string, text: string): boolean;
|
|
39
|
+
//# sourceMappingURL=task-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-metadata.d.ts","sourceRoot":"","sources":["../../src/data/task-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,gEAAgE;AAChE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,cAAc,CAAC;IACtB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,EAAE,CAQ/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAIjE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isPlainObject } from "../lib/collections.js";
|
|
2
|
+
function isScalar(value) {
|
|
3
|
+
return typeof value === "string" || typeof value === "number" || typeof value === "boolean";
|
|
4
|
+
}
|
|
5
|
+
function metadataEntries(value) {
|
|
6
|
+
if (!isPlainObject(value)) return [];
|
|
7
|
+
const entries = [];
|
|
8
|
+
for (const [key, item] of Object.entries(value)) {
|
|
9
|
+
if (!isScalar(item) || item === "") continue;
|
|
10
|
+
entries.push({ key, value: item, text: String(item) });
|
|
11
|
+
}
|
|
12
|
+
return entries;
|
|
13
|
+
}
|
|
14
|
+
function isFlatMetadata(value) {
|
|
15
|
+
return isPlainObject(value) && Object.values(value).every(isScalar);
|
|
16
|
+
}
|
|
17
|
+
const LINK_KEYS = /* @__PURE__ */ new Set(["href", "url", "link"]);
|
|
18
|
+
const HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;
|
|
19
|
+
const NAVIGABLE_URL = /^https?:\/\//i;
|
|
20
|
+
const OFF_SITE_PATH = /^\/[/\\]/;
|
|
21
|
+
function withoutBlanks(text) {
|
|
22
|
+
let stripped = "";
|
|
23
|
+
for (const character of text) if (character > " ") stripped += character;
|
|
24
|
+
return stripped;
|
|
25
|
+
}
|
|
26
|
+
function isMetadataLink(key, text) {
|
|
27
|
+
if (!LINK_KEYS.has(key) && !text.startsWith("/") && !text.startsWith("https://")) return false;
|
|
28
|
+
const destination = withoutBlanks(text);
|
|
29
|
+
return HAS_SCHEME.test(destination) ? NAVIGABLE_URL.test(destination) : !OFF_SITE_PATH.test(destination);
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
isFlatMetadata,
|
|
33
|
+
isMetadataLink,
|
|
34
|
+
metadataEntries
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=task-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-metadata.js","sources":["../../src/data/task-metadata.ts"],"sourcesContent":["/**\n * Task metadata is whatever JSON the producer chose to attach to a snapshot, so\n * rendering it starts with reading its shape rather than assuming one. The split\n * these helpers make is between values that read as a label — a state, a model,\n * a session id — and values that do not, because only the first kind can go in a\n * row of chips without turning into `[object Object]`.\n */\n\nimport { isPlainObject } from \"../lib/collections\";\n\n/** A metadata value that renders as one short piece of text. */\nexport type MetadataScalar = string | number | boolean;\n\nexport interface MetadataEntry {\n key: string;\n value: MetadataScalar;\n /** The text to render, and to test for a link. */\n text: string;\n}\n\nfunction isScalar(value: unknown): value is MetadataScalar {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\n/**\n * The scalar entries of a metadata object, in the producer's own key order.\n * Empty strings are dropped: a producer that reports a field it has no value for\n * yet is saying nothing, and a blank chip reads as a rendering fault.\n */\nexport function metadataEntries(value: unknown): MetadataEntry[] {\n if (!isPlainObject(value)) return [];\n const entries: MetadataEntry[] = [];\n for (const [key, item] of Object.entries(value)) {\n if (!isScalar(item) || item === \"\") continue;\n entries.push({ key, value: item, text: String(item) });\n }\n return entries;\n}\n\n/**\n * True when every value in the object is a scalar — the case a chip row or a\n * definition list can render completely, with nothing left over to fall back to\n * a JSON view for.\n */\nexport function isFlatMetadata(value: unknown): boolean {\n return isPlainObject(value) && Object.values(value).every(isScalar);\n}\n\n/** Keys whose value is meant as a destination rather than a label. */\nconst LINK_KEYS = new Set([\"href\", \"url\", \"link\"]);\n\nconst HAS_SCHEME = /^[a-z][a-z0-9+.-]*:/i;\n\n/** The schemes that only ever navigate. `javascript:` and `data:` run instead. */\nconst NAVIGABLE_URL = /^https?:\\/\\//i;\n\n/** A leading `//` or `/\\` is somewhere else entirely, wearing a path's clothes. */\nconst OFF_SITE_PATH = /^\\/[/\\\\]/;\n\n/** A browser ignores spaces and control characters when reading an href, so a scheme is read from the same stripped form it would see. */\nfunction withoutBlanks(text: string): string {\n let stripped = \"\";\n for (const character of text) if (character > \" \") stripped += character;\n return stripped;\n}\n\n/**\n * Whether a metadata value can be put in an `href`.\n *\n * The key says what the producer meant by a value; it does not say what the\n * value is. Metadata is whatever JSON reached this client over the task API or\n * the SSE stream, so a `url` of `javascript:…` is a script the page would run\n * on click rather than a place it would go. What may be linked is therefore\n * named rather than what may not: a relative reference, or an http(s) URL.\n * Anything else keeps rendering as the plain text it already was.\n */\nexport function isMetadataLink(key: string, text: string): boolean {\n if (!LINK_KEYS.has(key) && !text.startsWith(\"/\") && !text.startsWith(\"https://\")) return false;\n const destination = withoutBlanks(text);\n return HAS_SCHEME.test(destination) ? NAVIGABLE_URL.test(destination) : !OFF_SITE_PATH.test(destination);\n}\n"],"names":[],"mappings":";AAoBA,SAAS,SAAS,OAAyC;AACzD,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU;AACpF;AAOO,SAAS,gBAAgB,OAAiC;AAC/D,MAAI,CAAC,cAAc,KAAK,UAAU,CAAA;AAClC,QAAM,UAA2B,CAAA;AACjC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,CAAC,SAAS,IAAI,KAAK,SAAS,GAAI;AACpC,YAAQ,KAAK,EAAE,KAAK,OAAO,MAAM,MAAM,OAAO,IAAI,GAAG;AAAA,EACvD;AACA,SAAO;AACT;AAOO,SAAS,eAAe,OAAyB;AACtD,SAAO,cAAc,KAAK,KAAK,OAAO,OAAO,KAAK,EAAE,MAAM,QAAQ;AACpE;AAGA,MAAM,YAAY,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,CAAC;AAEjD,MAAM,aAAa;AAGnB,MAAM,gBAAgB;AAGtB,MAAM,gBAAgB;AAGtB,SAAS,cAAc,MAAsB;AAC3C,MAAI,WAAW;AACf,aAAW,aAAa,KAAM,KAAI,YAAY,IAAK,aAAY;AAC/D,SAAO;AACT;AAYO,SAAS,eAAe,KAAa,MAAuB;AACjE,MAAI,CAAC,UAAU,IAAI,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,UAAU,EAAG,QAAO;AACzF,QAAM,cAAc,cAAc,IAAI;AACtC,SAAO,WAAW,KAAK,WAAW,IAAI,cAAc,KAAK,WAAW,IAAI,CAAC,cAAc,KAAK,WAAW;AACzG;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const taskProcessDetails = require("./task-process-details.cjs");
|
|
4
|
+
function resourceSummary(snapshots, options) {
|
|
5
|
+
const processes = /* @__PURE__ */ new Map();
|
|
6
|
+
for (const snapshot of snapshots) {
|
|
7
|
+
if (snapshot.status !== "running" && snapshot.status !== "pending") continue;
|
|
8
|
+
if (!taskProcessDetails.isTaskProcessDetails(snapshot.details)) continue;
|
|
9
|
+
const key = snapshot.details.pid ? `${snapshot.details.command}:${snapshot.details.pid}` : snapshot.id;
|
|
10
|
+
if (!processes.has(key) || snapshot.type === "task") processes.set(key, snapshot);
|
|
11
|
+
}
|
|
12
|
+
if (!processes.size) return { state: "unavailable" };
|
|
13
|
+
let cpu = 0, rss = 0, sampledAt = options.now;
|
|
14
|
+
for (const snapshot of processes.values()) {
|
|
15
|
+
if (!taskProcessDetails.isTaskProcessDetails(snapshot.details)) continue;
|
|
16
|
+
const sample = snapshot.details.latest;
|
|
17
|
+
const at = Date.parse(sample.sampledAt);
|
|
18
|
+
if (!Number.isFinite(at) || at <= 0) return { state: "unavailable" };
|
|
19
|
+
cpu += sample.cpuPercent;
|
|
20
|
+
rss += sample.rssBytes;
|
|
21
|
+
sampledAt = Math.min(sampledAt, at);
|
|
22
|
+
}
|
|
23
|
+
return { state: options.connected && options.now - sampledAt <= 5e3 ? "fresh" : "stale", cpu, rss, sampledAt };
|
|
24
|
+
}
|
|
25
|
+
function taskTransportConnected(status) {
|
|
26
|
+
return status === "connected" || status === "polling" || status === "complete";
|
|
27
|
+
}
|
|
28
|
+
exports.resourceSummary = resourceSummary;
|
|
29
|
+
exports.taskTransportConnected = taskTransportConnected;
|
|
30
|
+
//# sourceMappingURL=task-resource-summary.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-resource-summary.cjs","sources":["../../src/data/task-resource-summary.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { isTaskProcessDetails } from \"./task-process-details\";\n\nexport type ResourceSummary = { state: \"fresh\" | \"stale\"; cpu: number; rss: number; sampledAt: number } | { state: \"unavailable\" };\n\nexport function resourceSummary(snapshots: TaskSnapshot[], options: { now: number; connected: boolean }): ResourceSummary {\n const processes = new Map<string, TaskSnapshot>();\n for (const snapshot of snapshots) {\n if (snapshot.status !== \"running\" && snapshot.status !== \"pending\") continue;\n if (!isTaskProcessDetails(snapshot.details)) continue;\n const key = snapshot.details.pid ? `${snapshot.details.command}:${snapshot.details.pid}` : snapshot.id;\n if (!processes.has(key) || snapshot.type === \"task\") processes.set(key, snapshot);\n }\n if (!processes.size) return { state: \"unavailable\" };\n let cpu = 0, rss = 0, sampledAt = options.now;\n for (const snapshot of processes.values()) {\n if (!isTaskProcessDetails(snapshot.details)) continue;\n const sample = snapshot.details.latest;\n const at = Date.parse(sample.sampledAt);\n if (!Number.isFinite(at) || at <= 0) return { state: \"unavailable\" };\n cpu += sample.cpuPercent;\n rss += sample.rssBytes;\n sampledAt = Math.min(sampledAt, at);\n }\n return { state: options.connected && options.now - sampledAt <= 5000 ? \"fresh\" : \"stale\", cpu, rss, sampledAt };\n}\n\nexport function taskTransportConnected(status: string): boolean {\n return status === \"connected\" || status === \"polling\" || status === \"complete\";\n}\n"],"names":["isTaskProcessDetails"],"mappings":";;;AAKO,SAAS,gBAAgB,WAA2B,SAA+D;AACxH,QAAM,gCAAgB,IAAA;AACtB,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,WAAW,aAAa,SAAS,WAAW,UAAW;AACpE,QAAI,CAACA,mBAAAA,qBAAqB,SAAS,OAAO,EAAG;AAC7C,UAAM,MAAM,SAAS,QAAQ,MAAM,GAAG,SAAS,QAAQ,OAAO,IAAI,SAAS,QAAQ,GAAG,KAAK,SAAS;AACpG,QAAI,CAAC,UAAU,IAAI,GAAG,KAAK,SAAS,SAAS,OAAQ,WAAU,IAAI,KAAK,QAAQ;AAAA,EAClF;AACA,MAAI,CAAC,UAAU,KAAM,QAAO,EAAE,OAAO,cAAA;AACrC,MAAI,MAAM,GAAG,MAAM,GAAG,YAAY,QAAQ;AAC1C,aAAW,YAAY,UAAU,UAAU;AACzC,QAAI,CAACA,mBAAAA,qBAAqB,SAAS,OAAO,EAAG;AAC7C,UAAM,SAAS,SAAS,QAAQ;AAChC,UAAM,KAAK,KAAK,MAAM,OAAO,SAAS;AACtC,QAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,EAAG,QAAO,EAAE,OAAO,cAAA;AACrD,WAAO,OAAO;AACd,WAAO,OAAO;AACd,gBAAY,KAAK,IAAI,WAAW,EAAE;AAAA,EACpC;AACA,SAAO,EAAE,OAAO,QAAQ,aAAa,QAAQ,MAAM,aAAa,MAAO,UAAU,SAAS,KAAK,KAAK,UAAA;AACtG;AAEO,SAAS,uBAAuB,QAAyB;AAC9D,SAAO,WAAW,eAAe,WAAW,aAAa,WAAW;AACtE;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { TaskSnapshot } from './TaskSnapshot';
|
|
2
|
+
export type ResourceSummary = {
|
|
3
|
+
state: "fresh" | "stale";
|
|
4
|
+
cpu: number;
|
|
5
|
+
rss: number;
|
|
6
|
+
sampledAt: number;
|
|
7
|
+
} | {
|
|
8
|
+
state: "unavailable";
|
|
9
|
+
};
|
|
10
|
+
export declare function resourceSummary(snapshots: TaskSnapshot[], options: {
|
|
11
|
+
now: number;
|
|
12
|
+
connected: boolean;
|
|
13
|
+
}): ResourceSummary;
|
|
14
|
+
export declare function taskTransportConnected(status: string): boolean;
|
|
15
|
+
//# sourceMappingURL=task-resource-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-resource-summary.d.ts","sourceRoot":"","sources":["../../src/data/task-resource-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,CAAC;AAEnI,wBAAgB,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,eAAe,CAoBxH;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE9D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { isTaskProcessDetails } from "./task-process-details.js";
|
|
2
|
+
function resourceSummary(snapshots, options) {
|
|
3
|
+
const processes = /* @__PURE__ */ new Map();
|
|
4
|
+
for (const snapshot of snapshots) {
|
|
5
|
+
if (snapshot.status !== "running" && snapshot.status !== "pending") continue;
|
|
6
|
+
if (!isTaskProcessDetails(snapshot.details)) continue;
|
|
7
|
+
const key = snapshot.details.pid ? `${snapshot.details.command}:${snapshot.details.pid}` : snapshot.id;
|
|
8
|
+
if (!processes.has(key) || snapshot.type === "task") processes.set(key, snapshot);
|
|
9
|
+
}
|
|
10
|
+
if (!processes.size) return { state: "unavailable" };
|
|
11
|
+
let cpu = 0, rss = 0, sampledAt = options.now;
|
|
12
|
+
for (const snapshot of processes.values()) {
|
|
13
|
+
if (!isTaskProcessDetails(snapshot.details)) continue;
|
|
14
|
+
const sample = snapshot.details.latest;
|
|
15
|
+
const at = Date.parse(sample.sampledAt);
|
|
16
|
+
if (!Number.isFinite(at) || at <= 0) return { state: "unavailable" };
|
|
17
|
+
cpu += sample.cpuPercent;
|
|
18
|
+
rss += sample.rssBytes;
|
|
19
|
+
sampledAt = Math.min(sampledAt, at);
|
|
20
|
+
}
|
|
21
|
+
return { state: options.connected && options.now - sampledAt <= 5e3 ? "fresh" : "stale", cpu, rss, sampledAt };
|
|
22
|
+
}
|
|
23
|
+
function taskTransportConnected(status) {
|
|
24
|
+
return status === "connected" || status === "polling" || status === "complete";
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
resourceSummary,
|
|
28
|
+
taskTransportConnected
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=task-resource-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-resource-summary.js","sources":["../../src/data/task-resource-summary.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { isTaskProcessDetails } from \"./task-process-details\";\n\nexport type ResourceSummary = { state: \"fresh\" | \"stale\"; cpu: number; rss: number; sampledAt: number } | { state: \"unavailable\" };\n\nexport function resourceSummary(snapshots: TaskSnapshot[], options: { now: number; connected: boolean }): ResourceSummary {\n const processes = new Map<string, TaskSnapshot>();\n for (const snapshot of snapshots) {\n if (snapshot.status !== \"running\" && snapshot.status !== \"pending\") continue;\n if (!isTaskProcessDetails(snapshot.details)) continue;\n const key = snapshot.details.pid ? `${snapshot.details.command}:${snapshot.details.pid}` : snapshot.id;\n if (!processes.has(key) || snapshot.type === \"task\") processes.set(key, snapshot);\n }\n if (!processes.size) return { state: \"unavailable\" };\n let cpu = 0, rss = 0, sampledAt = options.now;\n for (const snapshot of processes.values()) {\n if (!isTaskProcessDetails(snapshot.details)) continue;\n const sample = snapshot.details.latest;\n const at = Date.parse(sample.sampledAt);\n if (!Number.isFinite(at) || at <= 0) return { state: \"unavailable\" };\n cpu += sample.cpuPercent;\n rss += sample.rssBytes;\n sampledAt = Math.min(sampledAt, at);\n }\n return { state: options.connected && options.now - sampledAt <= 5000 ? \"fresh\" : \"stale\", cpu, rss, sampledAt };\n}\n\nexport function taskTransportConnected(status: string): boolean {\n return status === \"connected\" || status === \"polling\" || status === \"complete\";\n}\n"],"names":[],"mappings":";AAKO,SAAS,gBAAgB,WAA2B,SAA+D;AACxH,QAAM,gCAAgB,IAAA;AACtB,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,WAAW,aAAa,SAAS,WAAW,UAAW;AACpE,QAAI,CAAC,qBAAqB,SAAS,OAAO,EAAG;AAC7C,UAAM,MAAM,SAAS,QAAQ,MAAM,GAAG,SAAS,QAAQ,OAAO,IAAI,SAAS,QAAQ,GAAG,KAAK,SAAS;AACpG,QAAI,CAAC,UAAU,IAAI,GAAG,KAAK,SAAS,SAAS,OAAQ,WAAU,IAAI,KAAK,QAAQ;AAAA,EAClF;AACA,MAAI,CAAC,UAAU,KAAM,QAAO,EAAE,OAAO,cAAA;AACrC,MAAI,MAAM,GAAG,MAAM,GAAG,YAAY,QAAQ;AAC1C,aAAW,YAAY,UAAU,UAAU;AACzC,QAAI,CAAC,qBAAqB,SAAS,OAAO,EAAG;AAC7C,UAAM,SAAS,SAAS,QAAQ;AAChC,UAAM,KAAK,KAAK,MAAM,OAAO,SAAS;AACtC,QAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,EAAG,QAAO,EAAE,OAAO,cAAA;AACrD,WAAO,OAAO;AACd,WAAO,OAAO;AACd,gBAAY,KAAK,IAAI,WAAW,EAAE;AAAA,EACpC;AACA,SAAO,EAAE,OAAO,QAAQ,aAAa,QAAQ,MAAM,aAAa,MAAO,UAAU,SAAS,KAAK,KAAK,UAAA;AACtG;AAEO,SAAS,uBAAuB,QAAyB;AAC9D,SAAO,WAAW,eAAe,WAAW,aAAa,WAAW;AACtE;"}
|
|
@@ -71,7 +71,9 @@ function taskSegments(counts) {
|
|
|
71
71
|
{ count: counts.warn, color: "bg-yellow-400", label: "warnings" },
|
|
72
72
|
{ count: counts.fail, color: "bg-red-500", label: "failed" },
|
|
73
73
|
{ count: counts.run, color: "bg-blue-500", label: "running" },
|
|
74
|
-
{ count: counts.pending, color: "bg-gray-300", label: "pending" }
|
|
74
|
+
{ count: counts.pending, color: "bg-gray-300", label: "pending" },
|
|
75
|
+
{ count: counts.canceled ?? 0, color: "bg-gray-400", label: "canceled" },
|
|
76
|
+
{ count: counts.unstarted ?? 0, color: "bg-gray-200", label: "unstarted" }
|
|
75
77
|
];
|
|
76
78
|
}
|
|
77
79
|
function bucketTasks(tasks) {
|
|
@@ -80,6 +82,7 @@ function bucketTasks(tasks) {
|
|
|
80
82
|
let fail = 0;
|
|
81
83
|
let run = 0;
|
|
82
84
|
let pending = 0;
|
|
85
|
+
let canceled = 0;
|
|
83
86
|
for (const t of tasks) {
|
|
84
87
|
switch (t.status) {
|
|
85
88
|
case "success":
|
|
@@ -100,11 +103,14 @@ function bucketTasks(tasks) {
|
|
|
100
103
|
case "pending":
|
|
101
104
|
pending += 1;
|
|
102
105
|
break;
|
|
106
|
+
case "canceled":
|
|
107
|
+
canceled += 1;
|
|
108
|
+
break;
|
|
103
109
|
default:
|
|
104
110
|
ok += 1;
|
|
105
111
|
}
|
|
106
112
|
}
|
|
107
|
-
return { ok, warn, fail, run, pending };
|
|
113
|
+
return { ok, warn, fail, run, pending, canceled };
|
|
108
114
|
}
|
|
109
115
|
exports.bucketTasks = bucketTasks;
|
|
110
116
|
exports.logLevelColor = logLevelColor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-status.cjs","sources":["../../src/data/task-status.ts"],"sourcesContent":["import {\n UiCancel,\n UiCircleOutline,\n UiCircleX,\n UiClock,\n UiLoader,\n UiPass,\n UiWarningTriangle,\n} from \"../icons\";\nimport type { StaticIconComponent } from \"./Icon\";\nimport type { ProgressSegment } from \"./ProgressBar\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\n\n// Status → presentation maps, ported from clicky's task UI (task/ui/src/utils.ts)\n// so the React and Preact renderers agree on icon/color semantics.\n\nconst STATUS_COLORS: Record<string, string> = {\n success: \"text-green-600 dark:text-green-400\",\n PASS: \"text-green-600 dark:text-green-400\",\n completed: \"text-green-600 dark:text-green-400\",\n failed: \"text-red-600 dark:text-red-400\",\n FAIL: \"text-red-600 dark:text-red-400\",\n ERR: \"text-red-600 dark:text-red-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n running: \"text-blue-600 dark:text-blue-400\",\n pending: \"text-gray-400\",\n canceled: \"text-gray-400\",\n SKIP: \"text-gray-400\",\n};\n\n// Status → generated Ui* icon component. Rendered via <Icon icon={…}>; the\n// `running` glyph is spun with `animate-spin` at the call sites.\nconst STATUS_ICONS: Record<string, StaticIconComponent> = {\n pending: UiClock,\n running: UiLoader,\n success: UiPass,\n PASS: UiPass,\n completed: UiPass,\n failed: UiCircleX,\n FAIL: UiCircleX,\n ERR: UiCircleX,\n warning: UiWarningTriangle,\n canceled: UiCancel,\n SKIP: UiCancel,\n};\n\nconst STATUS_BG: Record<string, string> = {\n success: \"bg-green-100 dark:bg-green-500/20\",\n completed: \"bg-green-100 dark:bg-green-500/20\",\n PASS: \"bg-green-100 dark:bg-green-500/20\",\n failed: \"bg-red-100 dark:bg-red-500/20\",\n FAIL: \"bg-red-100 dark:bg-red-500/20\",\n ERR: \"bg-red-100 dark:bg-red-500/20\",\n warning: \"bg-yellow-100 dark:bg-yellow-500/20\",\n running: \"bg-blue-100 dark:bg-blue-500/20\",\n pending: \"bg-gray-100 dark:bg-gray-500/20\",\n};\n\nexport function taskStatusColor(s: string): string {\n return STATUS_COLORS[s] ?? \"text-gray-500\";\n}\n\nexport function taskStatusIcon(s: string): StaticIconComponent {\n return STATUS_ICONS[s] ?? UiCircleOutline;\n}\n\nexport function taskStatusBg(s: string): string {\n return STATUS_BG[s] ?? \"bg-gray-100 dark:bg-gray-500/20\";\n}\n\nexport function logLevelColor(level: string): string {\n switch (level) {\n case \"error\":\n return \"text-red-500\";\n case \"warn\":\n return \"text-yellow-600 dark:text-yellow-400\";\n case \"debug\":\n return \"text-gray-400\";\n default:\n return \"text-gray-500\";\n }\n}\n\n// taskSegments builds the colored progress-bar segments for a set of counts, in\n// the canonical clicky order (passed, warnings, failed, running, pending).\nexport function taskSegments(counts: {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n}): ProgressSegment[] {\n return [\n { count: counts.ok, color: \"bg-green-500\", label: \"passed\" },\n { count: counts.warn, color: \"bg-yellow-400\", label: \"warnings\" },\n { count: counts.fail, color: \"bg-red-500\", label: \"failed\" },\n { count: counts.run, color: \"bg-blue-500\", label: \"running\" },\n { count: counts.pending, color: \"bg-gray-300\", label: \"pending\" },\n ];\n}\n\n// bucketTasks tallies the child tasks of a group by status bucket.\nexport function bucketTasks(tasks: TaskSnapshot[]): {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n} {\n let ok = 0;\n let warn = 0;\n let fail = 0;\n let run = 0;\n let pending = 0;\n for (const t of tasks) {\n switch (t.status) {\n case \"success\":\n case \"PASS\":\n ok += 1;\n break;\n case \"warning\":\n warn += 1;\n break;\n case \"failed\":\n case \"FAIL\":\n case \"ERR\":\n fail += 1;\n break;\n case \"running\":\n run += 1;\n break;\n case \"pending\":\n pending += 1;\n break;\n default:\n ok += 1; // SKIP
|
|
1
|
+
{"version":3,"file":"task-status.cjs","sources":["../../src/data/task-status.ts"],"sourcesContent":["import {\n UiCancel,\n UiCircleOutline,\n UiCircleX,\n UiClock,\n UiLoader,\n UiPass,\n UiWarningTriangle,\n} from \"../icons\";\nimport type { StaticIconComponent } from \"./Icon\";\nimport type { ProgressSegment } from \"./ProgressBar\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\n\n// Status → presentation maps, ported from clicky's task UI (task/ui/src/utils.ts)\n// so the React and Preact renderers agree on icon/color semantics.\n\nconst STATUS_COLORS: Record<string, string> = {\n success: \"text-green-600 dark:text-green-400\",\n PASS: \"text-green-600 dark:text-green-400\",\n completed: \"text-green-600 dark:text-green-400\",\n failed: \"text-red-600 dark:text-red-400\",\n FAIL: \"text-red-600 dark:text-red-400\",\n ERR: \"text-red-600 dark:text-red-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n running: \"text-blue-600 dark:text-blue-400\",\n pending: \"text-gray-400\",\n canceled: \"text-gray-400\",\n SKIP: \"text-gray-400\",\n};\n\n// Status → generated Ui* icon component. Rendered via <Icon icon={…}>; the\n// `running` glyph is spun with `animate-spin` at the call sites.\nconst STATUS_ICONS: Record<string, StaticIconComponent> = {\n pending: UiClock,\n running: UiLoader,\n success: UiPass,\n PASS: UiPass,\n completed: UiPass,\n failed: UiCircleX,\n FAIL: UiCircleX,\n ERR: UiCircleX,\n warning: UiWarningTriangle,\n canceled: UiCancel,\n SKIP: UiCancel,\n};\n\nconst STATUS_BG: Record<string, string> = {\n success: \"bg-green-100 dark:bg-green-500/20\",\n completed: \"bg-green-100 dark:bg-green-500/20\",\n PASS: \"bg-green-100 dark:bg-green-500/20\",\n failed: \"bg-red-100 dark:bg-red-500/20\",\n FAIL: \"bg-red-100 dark:bg-red-500/20\",\n ERR: \"bg-red-100 dark:bg-red-500/20\",\n warning: \"bg-yellow-100 dark:bg-yellow-500/20\",\n running: \"bg-blue-100 dark:bg-blue-500/20\",\n pending: \"bg-gray-100 dark:bg-gray-500/20\",\n};\n\nexport function taskStatusColor(s: string): string {\n return STATUS_COLORS[s] ?? \"text-gray-500\";\n}\n\nexport function taskStatusIcon(s: string): StaticIconComponent {\n return STATUS_ICONS[s] ?? UiCircleOutline;\n}\n\nexport function taskStatusBg(s: string): string {\n return STATUS_BG[s] ?? \"bg-gray-100 dark:bg-gray-500/20\";\n}\n\nexport function logLevelColor(level: string): string {\n switch (level) {\n case \"error\":\n return \"text-red-500\";\n case \"warn\":\n return \"text-yellow-600 dark:text-yellow-400\";\n case \"debug\":\n return \"text-gray-400\";\n default:\n return \"text-gray-500\";\n }\n}\n\n// taskSegments builds the colored progress-bar segments for a set of counts, in\n// the canonical clicky order (passed, warnings, failed, running, pending).\nexport function taskSegments(counts: {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n canceled?: number;\n unstarted?: number;\n}): ProgressSegment[] {\n return [\n { count: counts.ok, color: \"bg-green-500\", label: \"passed\" },\n { count: counts.warn, color: \"bg-yellow-400\", label: \"warnings\" },\n { count: counts.fail, color: \"bg-red-500\", label: \"failed\" },\n { count: counts.run, color: \"bg-blue-500\", label: \"running\" },\n { count: counts.pending, color: \"bg-gray-300\", label: \"pending\" },\n { count: counts.canceled ?? 0, color: \"bg-gray-400\", label: \"canceled\" },\n { count: counts.unstarted ?? 0, color: \"bg-gray-200\", label: \"unstarted\" },\n ];\n}\n\n// bucketTasks tallies the child tasks of a group by status bucket.\nexport function bucketTasks(tasks: TaskSnapshot[]): {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n canceled: number;\n} {\n let ok = 0;\n let warn = 0;\n let fail = 0;\n let run = 0;\n let pending = 0;\n let canceled = 0;\n for (const t of tasks) {\n switch (t.status) {\n case \"success\":\n case \"PASS\":\n ok += 1;\n break;\n case \"warning\":\n warn += 1;\n break;\n case \"failed\":\n case \"FAIL\":\n case \"ERR\":\n fail += 1;\n break;\n case \"running\":\n run += 1;\n break;\n case \"pending\":\n pending += 1;\n break;\n case \"canceled\":\n canceled += 1;\n break;\n default:\n ok += 1; // SKIP and other terminal results count as done\n }\n }\n return { ok, warn, fail, run, pending, canceled };\n}\n"],"names":["UiClock","UiLoader","UiPass","UiCircleX","UiWarningTriangle","UiCancel","UiCircleOutline"],"mappings":";;;;;;;;;AAgBA,MAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAIA,MAAM,eAAoD;AAAA,EACxD,SAASA,QAAAA;AAAAA,EACT,SAASC,SAAAA;AAAAA,EACT,SAASC,OAAAA;AAAAA,EACT,MAAMA,OAAAA;AAAAA,EACN,WAAWA,OAAAA;AAAAA,EACX,QAAQC,UAAAA;AAAAA,EACR,MAAMA,UAAAA;AAAAA,EACN,KAAKA,UAAAA;AAAAA,EACL,SAASC,kBAAAA;AAAAA,EACT,UAAUC,SAAAA;AAAAA,EACV,MAAMA,SAAAA;AACR;AAEA,MAAM,YAAoC;AAAA,EACxC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEO,SAAS,gBAAgB,GAAmB;AACjD,SAAO,cAAc,CAAC,KAAK;AAC7B;AAEO,SAAS,eAAe,GAAgC;AAC7D,SAAO,aAAa,CAAC,KAAKC,gBAAAA;AAC5B;AAEO,SAAS,aAAa,GAAmB;AAC9C,SAAO,UAAU,CAAC,KAAK;AACzB;AAEO,SAAS,cAAc,OAAuB;AACnD,UAAQ,OAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAIO,SAAS,aAAa,QAQP;AACpB,SAAO;AAAA,IACL,EAAE,OAAO,OAAO,IAAI,OAAO,gBAAgB,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,MAAM,OAAO,iBAAiB,OAAO,WAAA;AAAA,IACrD,EAAE,OAAO,OAAO,MAAM,OAAO,cAAc,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,KAAK,OAAO,eAAe,OAAO,UAAA;AAAA,IAClD,EAAE,OAAO,OAAO,SAAS,OAAO,eAAe,OAAO,UAAA;AAAA,IACtD,EAAE,OAAO,OAAO,YAAY,GAAG,OAAO,eAAe,OAAO,WAAA;AAAA,IAC5D,EAAE,OAAO,OAAO,aAAa,GAAG,OAAO,eAAe,OAAO,YAAA;AAAA,EAAY;AAE7E;AAGO,SAAS,YAAY,OAO1B;AACA,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,MAAM;AACV,MAAI,UAAU;AACd,MAAI,WAAW;AACf,aAAW,KAAK,OAAO;AACrB,YAAQ,EAAE,QAAA;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AACH,cAAM;AACN;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,mBAAW;AACX;AAAA,MACF,KAAK;AACH,oBAAY;AACZ;AAAA,MACF;AACE,cAAM;AAAA,IAAA;AAAA,EAEZ;AACA,SAAO,EAAE,IAAI,MAAM,MAAM,KAAK,SAAS,SAAA;AACzC;;;;;;;"}
|
|
@@ -11,6 +11,8 @@ export declare function taskSegments(counts: {
|
|
|
11
11
|
fail: number;
|
|
12
12
|
run: number;
|
|
13
13
|
pending: number;
|
|
14
|
+
canceled?: number;
|
|
15
|
+
unstarted?: number;
|
|
14
16
|
}): ProgressSegment[];
|
|
15
17
|
export declare function bucketTasks(tasks: TaskSnapshot[]): {
|
|
16
18
|
ok: number;
|
|
@@ -18,5 +20,6 @@ export declare function bucketTasks(tasks: TaskSnapshot[]): {
|
|
|
18
20
|
fail: number;
|
|
19
21
|
run: number;
|
|
20
22
|
pending: number;
|
|
23
|
+
canceled: number;
|
|
21
24
|
};
|
|
22
25
|
//# sourceMappingURL=task-status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-status.d.ts","sourceRoot":"","sources":["../../src/data/task-status.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA+CnD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAE7D;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWnD;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"task-status.d.ts","sourceRoot":"","sources":["../../src/data/task-status.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA+CnD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAE7D;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWnD;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,eAAe,EAAE,CAUpB;AAGD,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAmCA"}
|
package/dist/data/task-status.js
CHANGED
|
@@ -69,7 +69,9 @@ function taskSegments(counts) {
|
|
|
69
69
|
{ count: counts.warn, color: "bg-yellow-400", label: "warnings" },
|
|
70
70
|
{ count: counts.fail, color: "bg-red-500", label: "failed" },
|
|
71
71
|
{ count: counts.run, color: "bg-blue-500", label: "running" },
|
|
72
|
-
{ count: counts.pending, color: "bg-gray-300", label: "pending" }
|
|
72
|
+
{ count: counts.pending, color: "bg-gray-300", label: "pending" },
|
|
73
|
+
{ count: counts.canceled ?? 0, color: "bg-gray-400", label: "canceled" },
|
|
74
|
+
{ count: counts.unstarted ?? 0, color: "bg-gray-200", label: "unstarted" }
|
|
73
75
|
];
|
|
74
76
|
}
|
|
75
77
|
function bucketTasks(tasks) {
|
|
@@ -78,6 +80,7 @@ function bucketTasks(tasks) {
|
|
|
78
80
|
let fail = 0;
|
|
79
81
|
let run = 0;
|
|
80
82
|
let pending = 0;
|
|
83
|
+
let canceled = 0;
|
|
81
84
|
for (const t of tasks) {
|
|
82
85
|
switch (t.status) {
|
|
83
86
|
case "success":
|
|
@@ -98,11 +101,14 @@ function bucketTasks(tasks) {
|
|
|
98
101
|
case "pending":
|
|
99
102
|
pending += 1;
|
|
100
103
|
break;
|
|
104
|
+
case "canceled":
|
|
105
|
+
canceled += 1;
|
|
106
|
+
break;
|
|
101
107
|
default:
|
|
102
108
|
ok += 1;
|
|
103
109
|
}
|
|
104
110
|
}
|
|
105
|
-
return { ok, warn, fail, run, pending };
|
|
111
|
+
return { ok, warn, fail, run, pending, canceled };
|
|
106
112
|
}
|
|
107
113
|
export {
|
|
108
114
|
bucketTasks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-status.js","sources":["../../src/data/task-status.ts"],"sourcesContent":["import {\n UiCancel,\n UiCircleOutline,\n UiCircleX,\n UiClock,\n UiLoader,\n UiPass,\n UiWarningTriangle,\n} from \"../icons\";\nimport type { StaticIconComponent } from \"./Icon\";\nimport type { ProgressSegment } from \"./ProgressBar\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\n\n// Status → presentation maps, ported from clicky's task UI (task/ui/src/utils.ts)\n// so the React and Preact renderers agree on icon/color semantics.\n\nconst STATUS_COLORS: Record<string, string> = {\n success: \"text-green-600 dark:text-green-400\",\n PASS: \"text-green-600 dark:text-green-400\",\n completed: \"text-green-600 dark:text-green-400\",\n failed: \"text-red-600 dark:text-red-400\",\n FAIL: \"text-red-600 dark:text-red-400\",\n ERR: \"text-red-600 dark:text-red-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n running: \"text-blue-600 dark:text-blue-400\",\n pending: \"text-gray-400\",\n canceled: \"text-gray-400\",\n SKIP: \"text-gray-400\",\n};\n\n// Status → generated Ui* icon component. Rendered via <Icon icon={…}>; the\n// `running` glyph is spun with `animate-spin` at the call sites.\nconst STATUS_ICONS: Record<string, StaticIconComponent> = {\n pending: UiClock,\n running: UiLoader,\n success: UiPass,\n PASS: UiPass,\n completed: UiPass,\n failed: UiCircleX,\n FAIL: UiCircleX,\n ERR: UiCircleX,\n warning: UiWarningTriangle,\n canceled: UiCancel,\n SKIP: UiCancel,\n};\n\nconst STATUS_BG: Record<string, string> = {\n success: \"bg-green-100 dark:bg-green-500/20\",\n completed: \"bg-green-100 dark:bg-green-500/20\",\n PASS: \"bg-green-100 dark:bg-green-500/20\",\n failed: \"bg-red-100 dark:bg-red-500/20\",\n FAIL: \"bg-red-100 dark:bg-red-500/20\",\n ERR: \"bg-red-100 dark:bg-red-500/20\",\n warning: \"bg-yellow-100 dark:bg-yellow-500/20\",\n running: \"bg-blue-100 dark:bg-blue-500/20\",\n pending: \"bg-gray-100 dark:bg-gray-500/20\",\n};\n\nexport function taskStatusColor(s: string): string {\n return STATUS_COLORS[s] ?? \"text-gray-500\";\n}\n\nexport function taskStatusIcon(s: string): StaticIconComponent {\n return STATUS_ICONS[s] ?? UiCircleOutline;\n}\n\nexport function taskStatusBg(s: string): string {\n return STATUS_BG[s] ?? \"bg-gray-100 dark:bg-gray-500/20\";\n}\n\nexport function logLevelColor(level: string): string {\n switch (level) {\n case \"error\":\n return \"text-red-500\";\n case \"warn\":\n return \"text-yellow-600 dark:text-yellow-400\";\n case \"debug\":\n return \"text-gray-400\";\n default:\n return \"text-gray-500\";\n }\n}\n\n// taskSegments builds the colored progress-bar segments for a set of counts, in\n// the canonical clicky order (passed, warnings, failed, running, pending).\nexport function taskSegments(counts: {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n}): ProgressSegment[] {\n return [\n { count: counts.ok, color: \"bg-green-500\", label: \"passed\" },\n { count: counts.warn, color: \"bg-yellow-400\", label: \"warnings\" },\n { count: counts.fail, color: \"bg-red-500\", label: \"failed\" },\n { count: counts.run, color: \"bg-blue-500\", label: \"running\" },\n { count: counts.pending, color: \"bg-gray-300\", label: \"pending\" },\n ];\n}\n\n// bucketTasks tallies the child tasks of a group by status bucket.\nexport function bucketTasks(tasks: TaskSnapshot[]): {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n} {\n let ok = 0;\n let warn = 0;\n let fail = 0;\n let run = 0;\n let pending = 0;\n for (const t of tasks) {\n switch (t.status) {\n case \"success\":\n case \"PASS\":\n ok += 1;\n break;\n case \"warning\":\n warn += 1;\n break;\n case \"failed\":\n case \"FAIL\":\n case \"ERR\":\n fail += 1;\n break;\n case \"running\":\n run += 1;\n break;\n case \"pending\":\n pending += 1;\n break;\n default:\n ok += 1; // SKIP
|
|
1
|
+
{"version":3,"file":"task-status.js","sources":["../../src/data/task-status.ts"],"sourcesContent":["import {\n UiCancel,\n UiCircleOutline,\n UiCircleX,\n UiClock,\n UiLoader,\n UiPass,\n UiWarningTriangle,\n} from \"../icons\";\nimport type { StaticIconComponent } from \"./Icon\";\nimport type { ProgressSegment } from \"./ProgressBar\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\n\n// Status → presentation maps, ported from clicky's task UI (task/ui/src/utils.ts)\n// so the React and Preact renderers agree on icon/color semantics.\n\nconst STATUS_COLORS: Record<string, string> = {\n success: \"text-green-600 dark:text-green-400\",\n PASS: \"text-green-600 dark:text-green-400\",\n completed: \"text-green-600 dark:text-green-400\",\n failed: \"text-red-600 dark:text-red-400\",\n FAIL: \"text-red-600 dark:text-red-400\",\n ERR: \"text-red-600 dark:text-red-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n running: \"text-blue-600 dark:text-blue-400\",\n pending: \"text-gray-400\",\n canceled: \"text-gray-400\",\n SKIP: \"text-gray-400\",\n};\n\n// Status → generated Ui* icon component. Rendered via <Icon icon={…}>; the\n// `running` glyph is spun with `animate-spin` at the call sites.\nconst STATUS_ICONS: Record<string, StaticIconComponent> = {\n pending: UiClock,\n running: UiLoader,\n success: UiPass,\n PASS: UiPass,\n completed: UiPass,\n failed: UiCircleX,\n FAIL: UiCircleX,\n ERR: UiCircleX,\n warning: UiWarningTriangle,\n canceled: UiCancel,\n SKIP: UiCancel,\n};\n\nconst STATUS_BG: Record<string, string> = {\n success: \"bg-green-100 dark:bg-green-500/20\",\n completed: \"bg-green-100 dark:bg-green-500/20\",\n PASS: \"bg-green-100 dark:bg-green-500/20\",\n failed: \"bg-red-100 dark:bg-red-500/20\",\n FAIL: \"bg-red-100 dark:bg-red-500/20\",\n ERR: \"bg-red-100 dark:bg-red-500/20\",\n warning: \"bg-yellow-100 dark:bg-yellow-500/20\",\n running: \"bg-blue-100 dark:bg-blue-500/20\",\n pending: \"bg-gray-100 dark:bg-gray-500/20\",\n};\n\nexport function taskStatusColor(s: string): string {\n return STATUS_COLORS[s] ?? \"text-gray-500\";\n}\n\nexport function taskStatusIcon(s: string): StaticIconComponent {\n return STATUS_ICONS[s] ?? UiCircleOutline;\n}\n\nexport function taskStatusBg(s: string): string {\n return STATUS_BG[s] ?? \"bg-gray-100 dark:bg-gray-500/20\";\n}\n\nexport function logLevelColor(level: string): string {\n switch (level) {\n case \"error\":\n return \"text-red-500\";\n case \"warn\":\n return \"text-yellow-600 dark:text-yellow-400\";\n case \"debug\":\n return \"text-gray-400\";\n default:\n return \"text-gray-500\";\n }\n}\n\n// taskSegments builds the colored progress-bar segments for a set of counts, in\n// the canonical clicky order (passed, warnings, failed, running, pending).\nexport function taskSegments(counts: {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n canceled?: number;\n unstarted?: number;\n}): ProgressSegment[] {\n return [\n { count: counts.ok, color: \"bg-green-500\", label: \"passed\" },\n { count: counts.warn, color: \"bg-yellow-400\", label: \"warnings\" },\n { count: counts.fail, color: \"bg-red-500\", label: \"failed\" },\n { count: counts.run, color: \"bg-blue-500\", label: \"running\" },\n { count: counts.pending, color: \"bg-gray-300\", label: \"pending\" },\n { count: counts.canceled ?? 0, color: \"bg-gray-400\", label: \"canceled\" },\n { count: counts.unstarted ?? 0, color: \"bg-gray-200\", label: \"unstarted\" },\n ];\n}\n\n// bucketTasks tallies the child tasks of a group by status bucket.\nexport function bucketTasks(tasks: TaskSnapshot[]): {\n ok: number;\n warn: number;\n fail: number;\n run: number;\n pending: number;\n canceled: number;\n} {\n let ok = 0;\n let warn = 0;\n let fail = 0;\n let run = 0;\n let pending = 0;\n let canceled = 0;\n for (const t of tasks) {\n switch (t.status) {\n case \"success\":\n case \"PASS\":\n ok += 1;\n break;\n case \"warning\":\n warn += 1;\n break;\n case \"failed\":\n case \"FAIL\":\n case \"ERR\":\n fail += 1;\n break;\n case \"running\":\n run += 1;\n break;\n case \"pending\":\n pending += 1;\n break;\n case \"canceled\":\n canceled += 1;\n break;\n default:\n ok += 1; // SKIP and other terminal results count as done\n }\n }\n return { ok, warn, fail, run, pending, canceled };\n}\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAIA,MAAM,eAAoD;AAAA,EACxD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,MAAM,YAAoC;AAAA,EACxC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEO,SAAS,gBAAgB,GAAmB;AACjD,SAAO,cAAc,CAAC,KAAK;AAC7B;AAEO,SAAS,eAAe,GAAgC;AAC7D,SAAO,aAAa,CAAC,KAAK;AAC5B;AAEO,SAAS,aAAa,GAAmB;AAC9C,SAAO,UAAU,CAAC,KAAK;AACzB;AAEO,SAAS,cAAc,OAAuB;AACnD,UAAQ,OAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAIO,SAAS,aAAa,QAQP;AACpB,SAAO;AAAA,IACL,EAAE,OAAO,OAAO,IAAI,OAAO,gBAAgB,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,MAAM,OAAO,iBAAiB,OAAO,WAAA;AAAA,IACrD,EAAE,OAAO,OAAO,MAAM,OAAO,cAAc,OAAO,SAAA;AAAA,IAClD,EAAE,OAAO,OAAO,KAAK,OAAO,eAAe,OAAO,UAAA;AAAA,IAClD,EAAE,OAAO,OAAO,SAAS,OAAO,eAAe,OAAO,UAAA;AAAA,IACtD,EAAE,OAAO,OAAO,YAAY,GAAG,OAAO,eAAe,OAAO,WAAA;AAAA,IAC5D,EAAE,OAAO,OAAO,aAAa,GAAG,OAAO,eAAe,OAAO,YAAA;AAAA,EAAY;AAE7E;AAGO,SAAS,YAAY,OAO1B;AACA,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,MAAM;AACV,MAAI,UAAU;AACd,MAAI,WAAW;AACf,aAAW,KAAK,OAAO;AACrB,YAAQ,EAAE,QAAA;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AACH,cAAM;AACN;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,mBAAW;AACX;AAAA,MACF,KAAK;AACH,oBAAY;AACZ;AAAA,MACF;AACE,cAAM;AAAA,IAAA;AAAA,EAEZ;AACA,SAAO,EAAE,IAAI,MAAM,MAAM,KAAK,SAAS,SAAA;AACzC;"}
|