@flanksource/clicky-ui 0.3.15 → 0.3.17
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/NOTICE.md +10 -0
- package/dist/ai.cjs +33 -4
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +31 -2
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +6 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +7 -1
- package/dist/chat.js.map +1 -1
- package/dist/components/Combobox.cjs +92 -170
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +2 -111
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +95 -173
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxActions.cjs +70 -0
- package/dist/components/ComboboxActions.cjs.map +1 -0
- package/dist/components/ComboboxActions.d.ts +8 -0
- package/dist/components/ComboboxActions.d.ts.map +1 -0
- package/dist/components/ComboboxActions.js +70 -0
- package/dist/components/ComboboxActions.js.map +1 -0
- package/dist/components/ComboboxMenu.cjs +160 -0
- package/dist/components/ComboboxMenu.cjs.map +1 -0
- package/dist/components/ComboboxMenu.d.ts +22 -0
- package/dist/components/ComboboxMenu.d.ts.map +1 -0
- package/dist/components/ComboboxMenu.js +160 -0
- package/dist/components/ComboboxMenu.js.map +1 -0
- package/dist/components/EndpointSelector.cjs +407 -0
- package/dist/components/EndpointSelector.cjs.map +1 -0
- package/dist/components/EndpointSelector.d.ts +3 -0
- package/dist/components/EndpointSelector.d.ts.map +1 -0
- package/dist/components/EndpointSelector.js +407 -0
- package/dist/components/EndpointSelector.js.map +1 -0
- package/dist/components/EndpointSelector.model.d.ts +52 -0
- package/dist/components/EndpointSelector.model.d.ts.map +1 -0
- package/dist/components/FilterBar.cjs +12 -0
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +4 -0
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +12 -0
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/InputField.cjs +11 -12
- package/dist/components/InputField.cjs.map +1 -1
- package/dist/components/InputField.d.ts +7 -0
- package/dist/components/InputField.d.ts.map +1 -1
- package/dist/components/InputField.js +12 -13
- package/dist/components/InputField.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +22 -16
- 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 +22 -16
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/MultiSelect.cjs +3 -3
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +3 -3
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/SecretKeySelector.cjs +150 -77
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +151 -78
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/WorkloadPicker.cjs +2 -1
- package/dist/components/WorkloadPicker.cjs.map +1 -1
- package/dist/components/WorkloadPicker.d.ts +6 -1
- package/dist/components/WorkloadPicker.d.ts.map +1 -1
- package/dist/components/WorkloadPicker.js +2 -1
- package/dist/components/WorkloadPicker.js.map +1 -1
- package/dist/components/combobox-types.d.ts +107 -0
- package/dist/components/combobox-types.d.ts.map +1 -0
- package/dist/components/combobox-utils.cjs +21 -0
- package/dist/components/combobox-utils.cjs.map +1 -0
- package/dist/components/combobox-utils.d.ts +15 -0
- package/dist/components/combobox-utils.d.ts.map +1 -0
- package/dist/components/combobox-utils.js +21 -0
- package/dist/components/combobox-utils.js.map +1 -0
- package/dist/components/endpoint-port.cjs +12 -0
- package/dist/components/endpoint-port.cjs.map +1 -0
- package/dist/components/endpoint-port.d.ts +4 -0
- package/dist/components/endpoint-port.d.ts.map +1 -0
- package/dist/components/endpoint-port.js +12 -0
- package/dist/components/endpoint-port.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +12 -23
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +12 -23
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-discriminator.cjs +6 -2
- package/dist/components/json-schema-form-discriminator.cjs.map +1 -1
- package/dist/components/json-schema-form-discriminator.d.ts.map +1 -1
- package/dist/components/json-schema-form-discriminator.js +6 -2
- package/dist/components/json-schema-form-discriminator.js.map +1 -1
- package/dist/components/json-schema-form-error-display.cjs +50 -0
- package/dist/components/json-schema-form-error-display.cjs.map +1 -0
- package/dist/components/json-schema-form-error-display.d.ts +12 -0
- package/dist/components/json-schema-form-error-display.d.ts.map +1 -0
- package/dist/components/json-schema-form-error-display.js +50 -0
- package/dist/components/json-schema-form-error-display.js.map +1 -0
- package/dist/components/json-schema-form-error-types.d.ts +26 -0
- package/dist/components/json-schema-form-error-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-errors.cjs +169 -0
- package/dist/components/json-schema-form-errors.cjs.map +1 -0
- package/dist/components/json-schema-form-errors.d.ts +14 -0
- package/dist/components/json-schema-form-errors.d.ts.map +1 -0
- package/dist/components/json-schema-form-errors.js +169 -0
- package/dist/components/json-schema-form-errors.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +12 -2
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +12 -2
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-refs.cjs +84 -19
- package/dist/components/json-schema-form-refs.cjs.map +1 -1
- package/dist/components/json-schema-form-refs.d.ts.map +1 -1
- package/dist/components/json-schema-form-refs.js +84 -19
- package/dist/components/json-schema-form-refs.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +33 -10
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +34 -11
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +16 -4
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -0
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +17 -5
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +4 -3
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components.cjs +13 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +8 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +15 -2
- package/dist/components.js.map +1 -1
- package/dist/data/DataTable.cjs +205 -14
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +41 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.cjs +21 -0
- package/dist/data/DataTable.grouping.cjs.map +1 -0
- package/dist/data/DataTable.grouping.d.ts +26 -0
- package/dist/data/DataTable.grouping.d.ts.map +1 -0
- package/dist/data/DataTable.grouping.js +21 -0
- package/dist/data/DataTable.grouping.js.map +1 -0
- package/dist/data/DataTable.js +205 -14
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Markdown.cjs +45 -1
- package/dist/data/Markdown.cjs.map +1 -1
- package/dist/data/Markdown.d.ts +3 -2
- package/dist/data/Markdown.d.ts.map +1 -1
- package/dist/data/Markdown.js +45 -1
- package/dist/data/Markdown.js.map +1 -1
- package/dist/data/MarkdownEditor.cjs +4 -3
- package/dist/data/MarkdownEditor.cjs.map +1 -1
- package/dist/data/MarkdownEditor.d.ts +6 -2
- package/dist/data/MarkdownEditor.d.ts.map +1 -1
- package/dist/data/MarkdownEditor.js +4 -3
- package/dist/data/MarkdownEditor.js.map +1 -1
- package/dist/data/ServerTimingBadge.cjs +64 -0
- package/dist/data/ServerTimingBadge.cjs.map +1 -0
- package/dist/data/ServerTimingBadge.d.ts +9 -0
- package/dist/data/ServerTimingBadge.d.ts.map +1 -0
- package/dist/data/ServerTimingBadge.js +64 -0
- package/dist/data/ServerTimingBadge.js.map +1 -0
- package/dist/data/StatStrip.cjs +99 -0
- package/dist/data/StatStrip.cjs.map +1 -0
- package/dist/data/StatStrip.d.ts +41 -0
- package/dist/data/StatStrip.d.ts.map +1 -0
- package/dist/data/StatStrip.js +99 -0
- package/dist/data/StatStrip.js.map +1 -0
- package/dist/data/TaskManager.cjs +20 -1
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts +3 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +20 -1
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +49 -0
- package/dist/data/TaskManagerButton.cjs.map +1 -0
- package/dist/data/TaskManagerButton.d.ts +8 -0
- package/dist/data/TaskManagerButton.d.ts.map +1 -0
- package/dist/data/TaskManagerButton.js +49 -0
- package/dist/data/TaskManagerButton.js.map +1 -0
- package/dist/data/TaskProcessDetails.cjs +113 -0
- package/dist/data/TaskProcessDetails.cjs.map +1 -0
- package/dist/data/TaskProcessDetails.d.ts +6 -0
- package/dist/data/TaskProcessDetails.d.ts.map +1 -0
- package/dist/data/TaskProcessDetails.js +113 -0
- package/dist/data/TaskProcessDetails.js.map +1 -0
- package/dist/data/TaskProgress.cjs +106 -19
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +4 -2
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +107 -20
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +43 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/Tree.cjs +91 -82
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +3 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +91 -82
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/TreeNode.cjs +3 -0
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts +2 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +3 -0
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +18 -141
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +2 -40
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +15 -138
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.models.cjs +11 -0
- package/dist/data/ai/ChatWindow.models.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.models.d.ts +3 -0
- package/dist/data/ai/ChatWindow.models.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.models.js +11 -0
- package/dist/data/ai/ChatWindow.models.js.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.cjs +57 -0
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.d.ts +13 -0
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.js +57 -0
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.cjs +14 -0
- package/dist/data/ai/ChatWindow.thread-status.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts +5 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.js +14 -0
- package/dist/data/ai/ChatWindow.thread-status.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread.cjs +68 -0
- package/dist/data/ai/ChatWindow.thread.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread.d.ts +16 -0
- package/dist/data/ai/ChatWindow.thread.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread.js +68 -0
- package/dist/data/ai/ChatWindow.thread.js.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +99 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +3 -0
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js +99 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -0
- package/dist/data/ai/ChatWindow.types.d.ts +41 -0
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -0
- package/dist/data/ai/ContextBadges.cjs +76 -46
- package/dist/data/ai/ContextBadges.cjs.map +1 -1
- package/dist/data/ai/ContextBadges.d.ts.map +1 -1
- package/dist/data/ai/ContextBadges.js +77 -47
- package/dist/data/ai/ContextBadges.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs +151 -32
- package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts +7 -4
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js +152 -33
- package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs +133 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs.map +1 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts +11 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts.map +1 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.js +133 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.js.map +1 -0
- package/dist/data/ai/PromptPicker/index.d.ts +2 -1
- package/dist/data/ai/PromptPicker/index.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.cjs +7 -0
- package/dist/data/ai/PromptPicker/types.cjs.map +1 -0
- package/dist/data/ai/PromptPicker/types.d.ts +18 -2
- package/dist/data/ai/PromptPicker/types.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.js +7 -0
- package/dist/data/ai/PromptPicker/types.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/index.cjs +171 -91
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +9 -9
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +175 -95
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.cjs +47 -0
- package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts +17 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.js +47 -0
- package/dist/data/ai/PromptRunEditor/model.js.map +1 -0
- package/dist/data/ai/RuntimeBar.cjs +408 -0
- package/dist/data/ai/RuntimeBar.cjs.map +1 -0
- package/dist/data/ai/RuntimeBar.d.ts +20 -0
- package/dist/data/ai/RuntimeBar.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBar.js +408 -0
- package/dist/data/ai/RuntimeBar.js.map +1 -0
- package/dist/data/ai/RuntimeBar.model.cjs +14 -0
- package/dist/data/ai/RuntimeBar.model.cjs.map +1 -0
- package/dist/data/ai/RuntimeBar.model.d.ts +10 -0
- package/dist/data/ai/RuntimeBar.model.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBar.model.js +14 -0
- package/dist/data/ai/RuntimeBar.model.js.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.cjs +359 -0
- package/dist/data/ai/RuntimeBarCombo.cjs.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.d.ts +22 -0
- package/dist/data/ai/RuntimeBarCombo.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.js +359 -0
- package/dist/data/ai/RuntimeBarCombo.js.map +1 -0
- package/dist/data/ai/SessionChatComposer.cjs +56 -0
- package/dist/data/ai/SessionChatComposer.cjs.map +1 -0
- package/dist/data/ai/SessionChatComposer.d.ts +24 -0
- package/dist/data/ai/SessionChatComposer.d.ts.map +1 -0
- package/dist/data/ai/SessionChatComposer.js +56 -0
- package/dist/data/ai/SessionChatComposer.js.map +1 -0
- package/dist/data/ai/SessionInspector.cjs +222 -382
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts +55 -0
- package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.cjs +377 -0
- package/dist/data/ai/SessionInspector.collection.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.collection.d.ts +15 -0
- package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.js +377 -0
- package/dist/data/ai/SessionInspector.collection.js.map +1 -0
- package/dist/data/ai/SessionInspector.d.ts +9 -4
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.files.cjs +162 -0
- package/dist/data/ai/SessionInspector.files.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.files.d.ts +5 -0
- package/dist/data/ai/SessionInspector.files.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.files.js +162 -0
- package/dist/data/ai/SessionInspector.files.js.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs +148 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +15 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.js +148 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.cjs +256 -0
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.d.ts +9 -0
- package/dist/data/ai/SessionInspector.hierarchy.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.js +256 -0
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -0
- package/dist/data/ai/SessionInspector.js +224 -384
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.model.cjs +125 -0
- package/dist/data/ai/SessionInspector.model.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.model.d.ts +14 -0
- package/dist/data/ai/SessionInspector.model.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.model.js +125 -0
- package/dist/data/ai/SessionInspector.model.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +265 -0
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.panels.d.ts +10 -0
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.panels.js +265 -0
- package/dist/data/ai/SessionInspector.panels.js.map +1 -0
- package/dist/data/ai/SessionInspector.plan.cjs +77 -0
- package/dist/data/ai/SessionInspector.plan.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.plan.d.ts +6 -0
- package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.plan.js +77 -0
- package/dist/data/ai/SessionInspector.plan.js.map +1 -0
- package/dist/data/ai/SessionInspector.summary.cjs +182 -0
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.summary.d.ts +8 -0
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.summary.js +182 -0
- package/dist/data/ai/SessionInspector.summary.js.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.cjs +94 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.d.ts +7 -0
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.js +94 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -0
- package/dist/data/ai/SessionInspector.turns.d.ts +11 -0
- package/dist/data/ai/SessionInspector.turns.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +86 -121
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +8 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.fixtures.d.ts +2 -0
- package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.cjs +118 -0
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.header.d.ts +11 -0
- package/dist/data/ai/SessionViewer.header.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.header.js +118 -0
- package/dist/data/ai/SessionViewer.header.js.map +1 -0
- package/dist/data/ai/SessionViewer.js +87 -122
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +111 -39
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +6 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +111 -39
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.row-metadata.cjs +132 -0
- package/dist/data/ai/SessionViewer.row-metadata.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.row-metadata.d.ts +14 -0
- package/dist/data/ai/SessionViewer.row-metadata.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.row-metadata.js +132 -0
- package/dist/data/ai/SessionViewer.row-metadata.js.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.cjs +15 -0
- package/dist/data/ai/SessionViewer.row-time.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.d.ts +3 -0
- package/dist/data/ai/SessionViewer.row-time.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.js +15 -0
- package/dist/data/ai/SessionViewer.row-time.js.map +1 -0
- package/dist/data/ai/SessionViewer.rows.cjs +37 -424
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +5 -2
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +31 -418
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.cjs +65 -0
- package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.d.ts +20 -0
- package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.js +65 -0
- package/dist/data/ai/SessionViewer.tool-details.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.cjs +404 -0
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.d.ts +12 -0
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.js +404 -0
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -0
- package/dist/data/ai/SessionViewer.unified.d.ts +11 -2
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +44 -26
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +47 -29
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +45 -153
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +51 -159
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +0 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +0 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs +0 -5
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js +0 -5
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +19 -6
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +5 -2
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +19 -6
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.cjs +67 -10
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +31 -4
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +67 -10
- package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.d.ts +2 -0
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +2 -1
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +2 -1
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/agent-action-icons.cjs +7 -10
- package/dist/data/ai/agent-action-icons.cjs.map +1 -1
- package/dist/data/ai/agent-action-icons.d.ts +1 -2
- package/dist/data/ai/agent-action-icons.d.ts.map +1 -1
- package/dist/data/ai/agent-action-icons.js +8 -11
- package/dist/data/ai/agent-action-icons.js.map +1 -1
- package/dist/data/ai/context.cjs.map +1 -1
- package/dist/data/ai/context.d.ts +4 -0
- package/dist/data/ai/context.d.ts.map +1 -1
- package/dist/data/ai/context.js.map +1 -1
- package/dist/data/ai/examples/sessions/claude-complete.cjs +513 -0
- package/dist/data/ai/examples/sessions/claude-complete.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/claude-complete.d.ts +3 -0
- package/dist/data/ai/examples/sessions/claude-complete.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/claude-complete.js +513 -0
- package/dist/data/ai/examples/sessions/claude-complete.js.map +1 -0
- package/dist/data/ai/examples/sessions/claude.cjs +252 -0
- package/dist/data/ai/examples/sessions/claude.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/claude.d.ts +3 -0
- package/dist/data/ai/examples/sessions/claude.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/claude.js +252 -0
- package/dist/data/ai/examples/sessions/claude.js.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.cjs +394 -0
- package/dist/data/ai/examples/sessions/codex-complete.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.d.ts +3 -0
- package/dist/data/ai/examples/sessions/codex-complete.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.js +394 -0
- package/dist/data/ai/examples/sessions/codex-complete.js.map +1 -0
- package/dist/data/ai/examples/sessions/codex.cjs +236 -0
- package/dist/data/ai/examples/sessions/codex.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/codex.d.ts +3 -0
- package/dist/data/ai/examples/sessions/codex.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/codex.js +236 -0
- package/dist/data/ai/examples/sessions/codex.js.map +1 -0
- package/dist/data/ai/examples/sessions/index.cjs +21 -0
- package/dist/data/ai/examples/sessions/index.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/index.d.ts +10 -0
- package/dist/data/ai/examples/sessions/index.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/index.js +21 -0
- package/dist/data/ai/examples/sessions/index.js.map +1 -0
- package/dist/data/ai/index.d.ts +9 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/model-capabilities.cjs +12 -1
- package/dist/data/ai/model-capabilities.cjs.map +1 -1
- package/dist/data/ai/model-capabilities.d.ts +2 -6
- package/dist/data/ai/model-capabilities.d.ts.map +1 -1
- package/dist/data/ai/model-capabilities.js +12 -1
- package/dist/data/ai/model-capabilities.js.map +1 -1
- package/dist/data/ai/runtime-mode.cjs +72 -1
- package/dist/data/ai/runtime-mode.cjs.map +1 -1
- package/dist/data/ai/runtime-mode.d.ts +28 -0
- package/dist/data/ai/runtime-mode.d.ts.map +1 -1
- package/dist/data/ai/runtime-mode.js +73 -2
- package/dist/data/ai/runtime-mode.js.map +1 -1
- package/dist/data/cells/EntityCell.cjs +64 -0
- package/dist/data/cells/EntityCell.cjs.map +1 -0
- package/dist/data/cells/EntityCell.d.ts +27 -0
- package/dist/data/cells/EntityCell.d.ts.map +1 -0
- package/dist/data/cells/EntityCell.js +64 -0
- package/dist/data/cells/EntityCell.js.map +1 -0
- package/dist/data/chat/Attachment.cjs +53 -13
- package/dist/data/chat/Attachment.cjs.map +1 -1
- package/dist/data/chat/Attachment.d.ts +9 -3
- package/dist/data/chat/Attachment.d.ts.map +1 -1
- package/dist/data/chat/Attachment.js +54 -14
- package/dist/data/chat/Attachment.js.map +1 -1
- package/dist/data/chat/Chat.cjs +113 -36
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +11 -4
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +111 -34
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +240 -66
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +11 -3
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +241 -67
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/Conversation.cjs +55 -3
- package/dist/data/chat/Conversation.cjs.map +1 -1
- package/dist/data/chat/Conversation.d.ts +5 -1
- package/dist/data/chat/Conversation.d.ts.map +1 -1
- package/dist/data/chat/Conversation.js +55 -3
- package/dist/data/chat/Conversation.js.map +1 -1
- package/dist/data/chat/ModelSelector.cjs +8 -10
- package/dist/data/chat/ModelSelector.cjs.map +1 -1
- package/dist/data/chat/ModelSelector.d.ts.map +1 -1
- package/dist/data/chat/ModelSelector.js +9 -11
- package/dist/data/chat/ModelSelector.js.map +1 -1
- package/dist/data/chat/PromptInput.cjs +56 -5
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +10 -1
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +57 -6
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/chat/approval.cjs +21 -0
- package/dist/data/chat/approval.cjs.map +1 -0
- package/dist/data/chat/approval.d.ts +11 -0
- package/dist/data/chat/approval.d.ts.map +1 -0
- package/dist/data/chat/approval.js +21 -0
- package/dist/data/chat/approval.js.map +1 -0
- package/dist/data/chat/attachment-upload.cjs +33 -0
- package/dist/data/chat/attachment-upload.cjs.map +1 -0
- package/dist/data/chat/attachment-upload.d.ts +21 -0
- package/dist/data/chat/attachment-upload.d.ts.map +1 -0
- package/dist/data/chat/attachment-upload.js +33 -0
- package/dist/data/chat/attachment-upload.js.map +1 -0
- package/dist/data/chat/effort-icons.cjs +36 -6
- package/dist/data/chat/effort-icons.cjs.map +1 -1
- package/dist/data/chat/effort-icons.d.ts +6 -3
- package/dist/data/chat/effort-icons.d.ts.map +1 -1
- package/dist/data/chat/effort-icons.js +37 -7
- package/dist/data/chat/effort-icons.js.map +1 -1
- package/dist/data/chat/index.d.ts +3 -1
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/models.cjs +8 -0
- package/dist/data/chat/models.cjs.map +1 -0
- package/dist/data/chat/models.d.ts +11 -0
- package/dist/data/chat/models.d.ts.map +1 -0
- package/dist/data/chat/models.js +8 -0
- package/dist/data/chat/models.js.map +1 -0
- package/dist/data/chat/provider-icons.cjs +49 -16
- package/dist/data/chat/provider-icons.cjs.map +1 -1
- package/dist/data/chat/provider-icons.d.ts +2 -0
- package/dist/data/chat/provider-icons.d.ts.map +1 -1
- package/dist/data/chat/provider-icons.js +50 -17
- package/dist/data/chat/provider-icons.js.map +1 -1
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +21 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/examples/markdown-preview-mock.cjs +45 -0
- package/dist/data/examples/markdown-preview-mock.cjs.map +1 -0
- package/dist/data/examples/markdown-preview-mock.d.ts +23 -0
- package/dist/data/examples/markdown-preview-mock.d.ts.map +1 -0
- package/dist/data/examples/markdown-preview-mock.js +45 -0
- package/dist/data/examples/markdown-preview-mock.js.map +1 -0
- package/dist/data/examples/markdown-syntax.cjs +36 -0
- package/dist/data/examples/markdown-syntax.cjs.map +1 -0
- package/dist/data/examples/markdown-syntax.d.ts +12 -0
- package/dist/data/examples/markdown-syntax.d.ts.map +1 -0
- package/dist/data/examples/markdown-syntax.js +36 -0
- package/dist/data/examples/markdown-syntax.js.map +1 -0
- package/dist/data/examples/markdown-syntax.md.cjs +4 -0
- package/dist/data/examples/markdown-syntax.md.cjs.map +1 -0
- package/dist/data/examples/markdown-syntax.md.js +5 -0
- package/dist/data/examples/markdown-syntax.md.js.map +1 -0
- package/dist/data/server-timing.cjs +120 -0
- package/dist/data/server-timing.cjs.map +1 -0
- package/dist/data/server-timing.d.ts +11 -0
- package/dist/data/server-timing.d.ts.map +1 -0
- package/dist/data/server-timing.js +120 -0
- package/dist/data/server-timing.js.map +1 -0
- package/dist/data/task-process-details.cjs +48 -0
- package/dist/data/task-process-details.cjs.map +1 -0
- package/dist/data/task-process-details.d.ts +5 -0
- package/dist/data/task-process-details.d.ts.map +1 -0
- package/dist/data/task-process-details.js +48 -0
- package/dist/data/task-process-details.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +37 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +37 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-hotkey.cjs +98 -0
- package/dist/hooks/use-hotkey.cjs.map +1 -0
- package/dist/hooks/use-hotkey.d.ts +42 -0
- package/dist/hooks/use-hotkey.d.ts.map +1 -0
- package/dist/hooks/use-hotkey.js +98 -0
- package/dist/hooks/use-hotkey.js.map +1 -0
- package/dist/hooks/use-task-run.cjs +23 -1
- 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 +23 -1
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks.cjs +4 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/icons/components/UiBank.cjs +15 -0
- package/dist/icons/components/UiBank.cjs.map +1 -0
- package/dist/icons/components/UiBank.d.ts +15 -0
- package/dist/icons/components/UiBank.d.ts.map +1 -0
- package/dist/icons/components/UiBank.js +15 -0
- package/dist/icons/components/UiBank.js.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.cjs +15 -0
- package/dist/icons/components/UiChartOfAccounts.cjs.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.d.ts +15 -0
- package/dist/icons/components/UiChartOfAccounts.d.ts.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.js +15 -0
- package/dist/icons/components/UiChartOfAccounts.js.map +1 -0
- package/dist/icons/components/UiCloudUpload.cjs +15 -0
- package/dist/icons/components/UiCloudUpload.cjs.map +1 -0
- package/dist/icons/components/UiCloudUpload.d.ts +15 -0
- package/dist/icons/components/UiCloudUpload.d.ts.map +1 -0
- package/dist/icons/components/UiCloudUpload.js +15 -0
- package/dist/icons/components/UiCloudUpload.js.map +1 -0
- package/dist/icons/components/UiLedger.cjs +15 -0
- package/dist/icons/components/UiLedger.cjs.map +1 -0
- package/dist/icons/components/UiLedger.d.ts +15 -0
- package/dist/icons/components/UiLedger.d.ts.map +1 -0
- package/dist/icons/components/UiLedger.js +15 -0
- package/dist/icons/components/UiLedger.js.map +1 -0
- package/dist/icons/components/UiReceipt.cjs +15 -0
- package/dist/icons/components/UiReceipt.cjs.map +1 -0
- package/dist/icons/components/UiReceipt.d.ts +15 -0
- package/dist/icons/components/UiReceipt.d.ts.map +1 -0
- package/dist/icons/components/UiReceipt.js +15 -0
- package/dist/icons/components/UiReceipt.js.map +1 -0
- package/dist/icons/index.d.ts +10 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons.cjs +15 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +15 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +54 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +56 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +270 -238
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +9 -0
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.debug.cjs +53 -0
- package/dist/layout/AppShell.debug.cjs.map +1 -0
- package/dist/layout/AppShell.debug.d.ts +6 -0
- package/dist/layout/AppShell.debug.d.ts.map +1 -0
- package/dist/layout/AppShell.debug.js +53 -0
- package/dist/layout/AppShell.debug.js.map +1 -0
- package/dist/layout/AppShell.js +269 -237
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +90 -0
- package/dist/layout/AppShell.nav.cjs.map +1 -0
- package/dist/layout/AppShell.nav.d.ts +7 -0
- package/dist/layout/AppShell.nav.d.ts.map +1 -0
- package/dist/layout/AppShell.nav.js +90 -0
- package/dist/layout/AppShell.nav.js.map +1 -0
- package/dist/layout/AppSidebar.cjs +35 -5
- package/dist/layout/AppSidebar.cjs.map +1 -1
- package/dist/layout/AppSidebar.d.ts +4 -1
- package/dist/layout/AppSidebar.d.ts.map +1 -1
- package/dist/layout/AppSidebar.js +35 -5
- package/dist/layout/AppSidebar.js.map +1 -1
- package/dist/layout/Panel.cjs +25 -41
- package/dist/layout/Panel.cjs.map +1 -1
- package/dist/layout/Panel.d.ts +2 -1
- package/dist/layout/Panel.d.ts.map +1 -1
- package/dist/layout/Panel.js +26 -42
- package/dist/layout/Panel.js.map +1 -1
- package/dist/layout/PanelFrame.cjs +56 -0
- package/dist/layout/PanelFrame.cjs.map +1 -0
- package/dist/layout/PanelFrame.d.ts +15 -0
- package/dist/layout/PanelFrame.d.ts.map +1 -0
- package/dist/layout/PanelFrame.js +56 -0
- package/dist/layout/PanelFrame.js.map +1 -0
- package/dist/layout/Section.cjs +51 -41
- package/dist/layout/Section.cjs.map +1 -1
- package/dist/layout/Section.d.ts +3 -2
- package/dist/layout/Section.d.ts.map +1 -1
- package/dist/layout/Section.js +51 -41
- package/dist/layout/Section.js.map +1 -1
- package/dist/layout/content-width.cjs +8 -0
- package/dist/layout/content-width.cjs.map +1 -0
- package/dist/layout/content-width.d.ts +3 -0
- package/dist/layout/content-width.d.ts.map +1 -0
- package/dist/layout/content-width.js +8 -0
- package/dist/layout/content-width.js.map +1 -0
- package/dist/overlay/CommandPalette.cjs +207 -0
- package/dist/overlay/CommandPalette.cjs.map +1 -0
- package/dist/overlay/CommandPalette.d.ts +71 -0
- package/dist/overlay/CommandPalette.d.ts.map +1 -0
- package/dist/overlay/CommandPalette.js +207 -0
- package/dist/overlay/CommandPalette.js.map +1 -0
- package/dist/overlay/CommandPalette.model.cjs +70 -0
- package/dist/overlay/CommandPalette.model.cjs.map +1 -0
- package/dist/overlay/CommandPalette.model.d.ts +71 -0
- package/dist/overlay/CommandPalette.model.d.ts.map +1 -0
- package/dist/overlay/CommandPalette.model.js +70 -0
- package/dist/overlay/CommandPalette.model.js.map +1 -0
- package/dist/overlay/CommandPaletteList.cjs +88 -0
- package/dist/overlay/CommandPaletteList.cjs.map +1 -0
- package/dist/overlay/CommandPaletteList.d.ts +23 -0
- package/dist/overlay/CommandPaletteList.d.ts.map +1 -0
- package/dist/overlay/CommandPaletteList.js +88 -0
- package/dist/overlay/CommandPaletteList.js.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.cjs +36 -0
- package/dist/overlay/CommandPaletteTrigger.cjs.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.d.ts +22 -0
- package/dist/overlay/CommandPaletteTrigger.d.ts.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.js +36 -0
- package/dist/overlay/CommandPaletteTrigger.js.map +1 -0
- package/dist/overlay/HoverCard.cjs.map +1 -1
- package/dist/overlay/HoverCard.d.ts +2 -2
- package/dist/overlay/HoverCard.d.ts.map +1 -1
- package/dist/overlay/HoverCard.js.map +1 -1
- package/dist/overlay/Modal.cjs +12 -5
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +12 -5
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/modalStack.js +1 -1
- package/dist/overlay/zIndex.cjs +2 -0
- package/dist/overlay/zIndex.cjs.map +1 -1
- package/dist/overlay/zIndex.js +2 -0
- package/dist/overlay/zIndex.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +6 -0
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +6 -0
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +45 -71
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +12 -2
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +46 -72
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +42 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +2 -1
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +42 -0
- package/dist/rpc/OperationResultView.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +2 -1
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +2 -1
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts +25 -2
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts +2 -1
- package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +1 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +15 -0
- package/dist/tailwind-preset.cjs.map +1 -1
- package/dist/tailwind-preset.d.ts.map +1 -1
- package/dist/tailwind-preset.js +15 -0
- package/dist/tailwind-preset.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import source from "./markdown-syntax.md.js";
|
|
2
|
+
const SECTION_MARKER = /^<!--section:(.+?)-->$/m;
|
|
3
|
+
function slug(title) {
|
|
4
|
+
return title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
5
|
+
}
|
|
6
|
+
function splitSections(text) {
|
|
7
|
+
var _a, _b;
|
|
8
|
+
const parts = text.split(SECTION_MARKER);
|
|
9
|
+
const sections = [];
|
|
10
|
+
for (let index = 1; index < parts.length; index += 2) {
|
|
11
|
+
const title = (_a = parts[index]) == null ? void 0 : _a.trim();
|
|
12
|
+
const markdown = (_b = parts[index + 1]) == null ? void 0 : _b.trim();
|
|
13
|
+
if (!title || !markdown) {
|
|
14
|
+
throw new Error(`markdown-syntax.md: empty section at marker ${index}`);
|
|
15
|
+
}
|
|
16
|
+
sections.push({ id: slug(title), title, markdown });
|
|
17
|
+
}
|
|
18
|
+
if (sections.length === 0) {
|
|
19
|
+
throw new Error("markdown-syntax.md: no <!--section:...--> markers found");
|
|
20
|
+
}
|
|
21
|
+
return sections;
|
|
22
|
+
}
|
|
23
|
+
const MARKDOWN_SYNTAX_SECTIONS = splitSections(source);
|
|
24
|
+
const MARKDOWN_SYNTAX_DOCUMENT = [
|
|
25
|
+
"# Markdown syntax reference",
|
|
26
|
+
...MARKDOWN_SYNTAX_SECTIONS.map(
|
|
27
|
+
(section) => `## ${section.title}
|
|
28
|
+
|
|
29
|
+
${section.markdown}`
|
|
30
|
+
)
|
|
31
|
+
].join("\n\n");
|
|
32
|
+
export {
|
|
33
|
+
MARKDOWN_SYNTAX_DOCUMENT,
|
|
34
|
+
MARKDOWN_SYNTAX_SECTIONS
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=markdown-syntax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-syntax.js","sources":["../../../src/data/examples/markdown-syntax.ts"],"sourcesContent":["import source from \"./markdown-syntax.md?raw\";\n\nexport type MarkdownSyntaxSection = {\n /** Slug of the title; used for demo anchors and test lookups. */\n id: string;\n title: string;\n /** The section snippet, renderable on its own. */\n markdown: string;\n};\n\n// The reference is authored as real markdown so the snippets stay readable and\n// escape-free. `<!--section:Title-->` markers split it into per-feature blocks;\n// they are HTML comments, so they render as nothing when the whole file is fed\n// to Markdown in one piece.\nconst SECTION_MARKER = /^<!--section:(.+?)-->$/m;\n\nfunction slug(title: string) {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction splitSections(text: string): MarkdownSyntaxSection[] {\n // String.split with a capturing group interleaves [preamble, title, body, ...].\n const parts = text.split(SECTION_MARKER);\n const sections: MarkdownSyntaxSection[] = [];\n for (let index = 1; index < parts.length; index += 2) {\n const title = parts[index]?.trim();\n const markdown = parts[index + 1]?.trim();\n if (!title || !markdown) {\n throw new Error(`markdown-syntax.md: empty section at marker ${index}`);\n }\n sections.push({ id: slug(title), title, markdown });\n }\n if (sections.length === 0) {\n throw new Error(\"markdown-syntax.md: no <!--section:...--> markers found\");\n }\n return sections;\n}\n\n/** Every supported (and explicitly unsupported) construct, one entry per feature. */\nexport const MARKDOWN_SYNTAX_SECTIONS: readonly MarkdownSyntaxSection[] =\n splitSections(source);\n\n/** The same sections as one navigable document, each under its own `##` heading. */\nexport const MARKDOWN_SYNTAX_DOCUMENT = [\n \"# Markdown syntax reference\",\n ...MARKDOWN_SYNTAX_SECTIONS.map(\n (section) => `## ${section.title}\\n\\n${section.markdown}`,\n ),\n].join(\"\\n\\n\");\n"],"names":[],"mappings":";AAcA,MAAM,iBAAiB;AAEvB,SAAS,KAAK,OAAe;AAC3B,SAAO,MACJ,cACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AACzB;AAEA,SAAS,cAAc,MAAuC;;AAE5D,QAAM,QAAQ,KAAK,MAAM,cAAc;AACvC,QAAM,WAAoC,CAAA;AAC1C,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,SAAQ,WAAM,KAAK,MAAX,mBAAc;AAC5B,UAAM,YAAW,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AACnC,QAAI,CAAC,SAAS,CAAC,UAAU;AACvB,YAAM,IAAI,MAAM,+CAA+C,KAAK,EAAE;AAAA,IACxE;AACA,aAAS,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG,OAAO,UAAU;AAAA,EACpD;AACA,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,SAAO;AACT;AAGO,MAAM,2BACX,cAAc,MAAM;AAGf,MAAM,2BAA2B;AAAA,EACtC;AAAA,EACA,GAAG,yBAAyB;AAAA,IAC1B,CAAC,YAAY,MAAM,QAAQ,KAAK;AAAA;AAAA,EAAO,QAAQ,QAAQ;AAAA,EAAA;AAE3D,EAAE,KAAK,MAAM;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const source = '<!--section:Headings-->\n# Heading level 1\n\n## Heading level 2\n\n### Heading level 3\n\n#### Heading level 4\n\n##### Heading level 5\n\n###### Heading level 6\n\nSetext level 1\n==============\n\nSetext level 2\n--------------\n\n<!--section:Paragraphs and line breaks-->\nA paragraph is one or more lines of text. Source lines that are merely wrapped\njoin back into a single line when rendered.\n\nTwo trailing spaces force a hard break, \nso this continues on its own line. A trailing backslash does the same,\\\nand so does this one.\n\n<!--section:Emphasis and inline styles-->\n*Single asterisks* and _single underscores_ mark emphasis. **Double asterisks**\nand __double underscores__ mark strong text, and ***the two together*** combine\nthem. GFM adds ~~strikethrough~~.\n\nInline `code` uses single backticks. ``A span containing a ` backtick`` doubles\nthe fence.\n\n<!--section:Escapes and entities-->\nBackslash escapes keep markdown punctuation literal: \\*not emphasis\\*,\n\\_not emphasis\\_, \\`not code\\`, and \\# not a heading.\n\nNamed and numeric HTML entities resolve: © 2026, A & B, an em dash\n— an ellipsis … and a non-breaking space.\n\n<!--section:Lists-->\n- A bullet item\n- Another bullet item\n - Nested one level\n - Nested two levels\n- Back to the top level\n\nThe `-`, `*`, and `+` markers are interchangeable.\n\n1. An ordered item\n2. Another ordered item\n 1. Nested one level\n 2. Still nested\n3. Back to the top level\n\nOnly the first number matters; the rest are renumbered on render.\n\n1. A list item holds any block content while its continuation stays indented.\n\n ```bash\n pnpm --filter @flanksource/clicky-ui build\n ```\n\n2. Blank lines between items make the list loose, so every item is wrapped in a\n paragraph of its own.\n\n<!--section:Task lists-->\n- [x] A completed task\n- [ ] An outstanding task\n- [ ] A task with **emphasis**, `code`, and a [link](https://example.com)\n\n<!--section:Links-->\nAn [inline link](https://example.com), one\n[with a title](https://example.com "Shown on hover"), and one pointing at\n[a page fragment](#tables).\n\nAngle autolinks render their target: <https://example.com>.\n\nGFM literal autolinks need no markup at all — https://example.com,\nwww.example.com, and hello@example.com all become links.\n\n<!--section:Images-->\n\n\nRelative and `http(s)` sources render. Inline `data:` sources are refused by the\nsanitizer, which substitutes a placeholder:\n\n\n\n<!--section:Blockquotes-->\n> A single-level quote.\n\n> A quote carries any block content:\n>\n> - a list,\n> - **inline formatting**,\n>\n> > and a nested quote.\n\n<!--section:Code-->\nA fence with a language hint renders through the library `CodeBlock`, which adds\ncopy, download, and per-block theme controls:\n\n```ts\nexport function greet(name: string): string {\n return `Hello, ${name}`;\n}\n```\n\nA fence with no language falls back to plain text:\n\n```\nNo language hint here.\n```\n\nFour-space indentation also opens a code block:\n\n indented code block\n second line\n\n<!--section:Tables-->\nThe delimiter row sets column alignment — `:--` left, `:-:` center, `--:` right.\n\n| Feature | Supported | Since |\n| :-------- | :-------: | -----: |\n| Tables | yes | GFM |\n| Alignment | yes | GFM |\n| Footnotes | yes | GFM |\n\nCells take inline formatting, escape a literal pipe as `\\|`, and may be empty.\n\n| Cell | Renders |\n| ----------- | ---------------------------- |\n| formatting | **bold**, `code`, ~~struck~~ |\n| escaped bar | a \\| b |\n| empty | |\n\n<!--section:Footnotes-->\nFootnotes are a GFM extension[^1]; labels may be words[^label], and the\ndefinitions collect at the end of the rendered block wherever they are written.\n\n[^1]: A numbered footnote definition.\n[^label]: Definitions are ordered by first reference, not by label.\n\n<!--section:Thematic breaks-->\nThree or more hyphens, asterisks, or underscores alone on a line draw a rule.\n\n---\n\n***\n\n___\n\n<!--section:Inline HTML-->\nRaw HTML inside the allow list passes through: press <kbd>Ctrl</kbd>+<kbd>C</kbd>,\nwrite H<sub>2</sub>O and E=mc<sup>2</sup>, mark text <ins>inserted</ins> or\n<del>deleted</del>, and break a line<br />like this.\n\n<details>\n<summary>A collapsible section</summary>\n\nMarkdown keeps working inside, including **emphasis** and lists:\n\n- one\n- two\n\n</details>\n\n<dl>\n <dt>Definition list</dt>\n <dd>Rendered from raw <code>dl</code>, <code>dt</code> and <code>dd</code> tags.</dd>\n</dl>\n\n<div align="center">A centered block.</div>\n\n<!--section:Sanitized HTML-->\nMarkup outside the allow list is removed. A script tag is dropped whole —\n<script>alert(\'xss\')<\/script>leaving nothing behind.\n\nUnlisted tags are unwrapped to their text, so <mark>mark</mark> and\n<abbr title="HyperText Markup Language">abbr</abbr> keep the words but lose the\nelement. HTML comments never reach the DOM:\n\n<!-- this comment is not rendered -->\n\n<!--section:Unsupported syntax-->\n### Reference links\n\nA link reference definition is a block of its own, which the streaming parser\nnever joins back up, so [reference links][ref] and ![reference images][ref] stay\nliteral.\n\n[ref]: https://example.com\n\n### Math\n\nKaTeX arrives with the optional `@streamdown/math` plugin, which this build does\nnot install, so $E = mc^2$ and $$a^2 + b^2 = c^2$$ render as plain text.\n\n### Mermaid\n\nDiagrams need the optional `@streamdown/mermaid` plugin. Without it a `mermaid`\nfence is just another code block:\n\n```mermaid\ngraph TD;\n A[Start] --> B[Finish];\n```\n\n### Front matter\n\nYAML front matter is not stripped: the `---` delimiters parse as a thematic\nbreak followed by a setext heading.\n';
|
|
3
|
+
module.exports = source;
|
|
4
|
+
//# sourceMappingURL=markdown-syntax.md.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-syntax.md.cjs","sources":["../../../src/data/examples/markdown-syntax.md?raw"],"sourcesContent":["export default \"<!--section:Headings-->\\n# Heading level 1\\n\\n## Heading level 2\\n\\n### Heading level 3\\n\\n#### Heading level 4\\n\\n##### Heading level 5\\n\\n###### Heading level 6\\n\\nSetext level 1\\n==============\\n\\nSetext level 2\\n--------------\\n\\n<!--section:Paragraphs and line breaks-->\\nA paragraph is one or more lines of text. Source lines that are merely wrapped\\njoin back into a single line when rendered.\\n\\nTwo trailing spaces force a hard break, \\nso this continues on its own line. A trailing backslash does the same,\\\\\\nand so does this one.\\n\\n<!--section:Emphasis and inline styles-->\\n*Single asterisks* and _single underscores_ mark emphasis. **Double asterisks**\\nand __double underscores__ mark strong text, and ***the two together*** combine\\nthem. GFM adds ~~strikethrough~~.\\n\\nInline `code` uses single backticks. ``A span containing a ` backtick`` doubles\\nthe fence.\\n\\n<!--section:Escapes and entities-->\\nBackslash escapes keep markdown punctuation literal: \\\\*not emphasis\\\\*,\\n\\\\_not emphasis\\\\_, \\\\`not code\\\\`, and \\\\# not a heading.\\n\\nNamed and numeric HTML entities resolve: © 2026, A & B, an em dash\\n— an ellipsis … and a non-breaking space.\\n\\n<!--section:Lists-->\\n- A bullet item\\n- Another bullet item\\n - Nested one level\\n - Nested two levels\\n- Back to the top level\\n\\nThe `-`, `*`, and `+` markers are interchangeable.\\n\\n1. An ordered item\\n2. Another ordered item\\n 1. Nested one level\\n 2. Still nested\\n3. Back to the top level\\n\\nOnly the first number matters; the rest are renumbered on render.\\n\\n1. A list item holds any block content while its continuation stays indented.\\n\\n ```bash\\n pnpm --filter @flanksource/clicky-ui build\\n ```\\n\\n2. Blank lines between items make the list loose, so every item is wrapped in a\\n paragraph of its own.\\n\\n<!--section:Task lists-->\\n- [x] A completed task\\n- [ ] An outstanding task\\n- [ ] A task with **emphasis**, `code`, and a [link](https://example.com)\\n\\n<!--section:Links-->\\nAn [inline link](https://example.com), one\\n[with a title](https://example.com \\\"Shown on hover\\\"), and one pointing at\\n[a page fragment](#tables).\\n\\nAngle autolinks render their target: <https://example.com>.\\n\\nGFM literal autolinks need no markup at all — https://example.com,\\nwww.example.com, and hello@example.com all become links.\\n\\n<!--section:Images-->\\n\\n\\nRelative and `http(s)` sources render. Inline `data:` sources are refused by the\\nsanitizer, which substitutes a placeholder:\\n\\n\\n\\n<!--section:Blockquotes-->\\n> A single-level quote.\\n\\n> A quote carries any block content:\\n>\\n> - a list,\\n> - **inline formatting**,\\n>\\n> > and a nested quote.\\n\\n<!--section:Code-->\\nA fence with a language hint renders through the library `CodeBlock`, which adds\\ncopy, download, and per-block theme controls:\\n\\n```ts\\nexport function greet(name: string): string {\\n return `Hello, ${name}`;\\n}\\n```\\n\\nA fence with no language falls back to plain text:\\n\\n```\\nNo language hint here.\\n```\\n\\nFour-space indentation also opens a code block:\\n\\n indented code block\\n second line\\n\\n<!--section:Tables-->\\nThe delimiter row sets column alignment — `:--` left, `:-:` center, `--:` right.\\n\\n| Feature | Supported | Since |\\n| :-------- | :-------: | -----: |\\n| Tables | yes | GFM |\\n| Alignment | yes | GFM |\\n| Footnotes | yes | GFM |\\n\\nCells take inline formatting, escape a literal pipe as `\\\\|`, and may be empty.\\n\\n| Cell | Renders |\\n| ----------- | ---------------------------- |\\n| formatting | **bold**, `code`, ~~struck~~ |\\n| escaped bar | a \\\\| b |\\n| empty | |\\n\\n<!--section:Footnotes-->\\nFootnotes are a GFM extension[^1]; labels may be words[^label], and the\\ndefinitions collect at the end of the rendered block wherever they are written.\\n\\n[^1]: A numbered footnote definition.\\n[^label]: Definitions are ordered by first reference, not by label.\\n\\n<!--section:Thematic breaks-->\\nThree or more hyphens, asterisks, or underscores alone on a line draw a rule.\\n\\n---\\n\\n***\\n\\n___\\n\\n<!--section:Inline HTML-->\\nRaw HTML inside the allow list passes through: press <kbd>Ctrl</kbd>+<kbd>C</kbd>,\\nwrite H<sub>2</sub>O and E=mc<sup>2</sup>, mark text <ins>inserted</ins> or\\n<del>deleted</del>, and break a line<br />like this.\\n\\n<details>\\n<summary>A collapsible section</summary>\\n\\nMarkdown keeps working inside, including **emphasis** and lists:\\n\\n- one\\n- two\\n\\n</details>\\n\\n<dl>\\n <dt>Definition list</dt>\\n <dd>Rendered from raw <code>dl</code>, <code>dt</code> and <code>dd</code> tags.</dd>\\n</dl>\\n\\n<div align=\\\"center\\\">A centered block.</div>\\n\\n<!--section:Sanitized HTML-->\\nMarkup outside the allow list is removed. A script tag is dropped whole —\\n<script>alert('xss')</script>leaving nothing behind.\\n\\nUnlisted tags are unwrapped to their text, so <mark>mark</mark> and\\n<abbr title=\\\"HyperText Markup Language\\\">abbr</abbr> keep the words but lose the\\nelement. HTML comments never reach the DOM:\\n\\n<!-- this comment is not rendered -->\\n\\n<!--section:Unsupported syntax-->\\n### Reference links\\n\\nA link reference definition is a block of its own, which the streaming parser\\nnever joins back up, so [reference links][ref] and ![reference images][ref] stay\\nliteral.\\n\\n[ref]: https://example.com\\n\\n### Math\\n\\nKaTeX arrives with the optional `@streamdown/math` plugin, which this build does\\nnot install, so $E = mc^2$ and $$a^2 + b^2 = c^2$$ render as plain text.\\n\\n### Mermaid\\n\\nDiagrams need the optional `@streamdown/mermaid` plugin. Without it a `mermaid`\\nfence is just another code block:\\n\\n```mermaid\\ngraph TD;\\n A[Start] --> B[Finish];\\n```\\n\\n### Front matter\\n\\nYAML front matter is not stripped: the `---` delimiters parse as a thematic\\nbreak followed by a setext heading.\\n\""],"names":[],"mappings":";AAAA,MAAA,SAAe;;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const source = '<!--section:Headings-->\n# Heading level 1\n\n## Heading level 2\n\n### Heading level 3\n\n#### Heading level 4\n\n##### Heading level 5\n\n###### Heading level 6\n\nSetext level 1\n==============\n\nSetext level 2\n--------------\n\n<!--section:Paragraphs and line breaks-->\nA paragraph is one or more lines of text. Source lines that are merely wrapped\njoin back into a single line when rendered.\n\nTwo trailing spaces force a hard break, \nso this continues on its own line. A trailing backslash does the same,\\\nand so does this one.\n\n<!--section:Emphasis and inline styles-->\n*Single asterisks* and _single underscores_ mark emphasis. **Double asterisks**\nand __double underscores__ mark strong text, and ***the two together*** combine\nthem. GFM adds ~~strikethrough~~.\n\nInline `code` uses single backticks. ``A span containing a ` backtick`` doubles\nthe fence.\n\n<!--section:Escapes and entities-->\nBackslash escapes keep markdown punctuation literal: \\*not emphasis\\*,\n\\_not emphasis\\_, \\`not code\\`, and \\# not a heading.\n\nNamed and numeric HTML entities resolve: © 2026, A & B, an em dash\n— an ellipsis … and a non-breaking space.\n\n<!--section:Lists-->\n- A bullet item\n- Another bullet item\n - Nested one level\n - Nested two levels\n- Back to the top level\n\nThe `-`, `*`, and `+` markers are interchangeable.\n\n1. An ordered item\n2. Another ordered item\n 1. Nested one level\n 2. Still nested\n3. Back to the top level\n\nOnly the first number matters; the rest are renumbered on render.\n\n1. A list item holds any block content while its continuation stays indented.\n\n ```bash\n pnpm --filter @flanksource/clicky-ui build\n ```\n\n2. Blank lines between items make the list loose, so every item is wrapped in a\n paragraph of its own.\n\n<!--section:Task lists-->\n- [x] A completed task\n- [ ] An outstanding task\n- [ ] A task with **emphasis**, `code`, and a [link](https://example.com)\n\n<!--section:Links-->\nAn [inline link](https://example.com), one\n[with a title](https://example.com "Shown on hover"), and one pointing at\n[a page fragment](#tables).\n\nAngle autolinks render their target: <https://example.com>.\n\nGFM literal autolinks need no markup at all — https://example.com,\nwww.example.com, and hello@example.com all become links.\n\n<!--section:Images-->\n\n\nRelative and `http(s)` sources render. Inline `data:` sources are refused by the\nsanitizer, which substitutes a placeholder:\n\n\n\n<!--section:Blockquotes-->\n> A single-level quote.\n\n> A quote carries any block content:\n>\n> - a list,\n> - **inline formatting**,\n>\n> > and a nested quote.\n\n<!--section:Code-->\nA fence with a language hint renders through the library `CodeBlock`, which adds\ncopy, download, and per-block theme controls:\n\n```ts\nexport function greet(name: string): string {\n return `Hello, ${name}`;\n}\n```\n\nA fence with no language falls back to plain text:\n\n```\nNo language hint here.\n```\n\nFour-space indentation also opens a code block:\n\n indented code block\n second line\n\n<!--section:Tables-->\nThe delimiter row sets column alignment — `:--` left, `:-:` center, `--:` right.\n\n| Feature | Supported | Since |\n| :-------- | :-------: | -----: |\n| Tables | yes | GFM |\n| Alignment | yes | GFM |\n| Footnotes | yes | GFM |\n\nCells take inline formatting, escape a literal pipe as `\\|`, and may be empty.\n\n| Cell | Renders |\n| ----------- | ---------------------------- |\n| formatting | **bold**, `code`, ~~struck~~ |\n| escaped bar | a \\| b |\n| empty | |\n\n<!--section:Footnotes-->\nFootnotes are a GFM extension[^1]; labels may be words[^label], and the\ndefinitions collect at the end of the rendered block wherever they are written.\n\n[^1]: A numbered footnote definition.\n[^label]: Definitions are ordered by first reference, not by label.\n\n<!--section:Thematic breaks-->\nThree or more hyphens, asterisks, or underscores alone on a line draw a rule.\n\n---\n\n***\n\n___\n\n<!--section:Inline HTML-->\nRaw HTML inside the allow list passes through: press <kbd>Ctrl</kbd>+<kbd>C</kbd>,\nwrite H<sub>2</sub>O and E=mc<sup>2</sup>, mark text <ins>inserted</ins> or\n<del>deleted</del>, and break a line<br />like this.\n\n<details>\n<summary>A collapsible section</summary>\n\nMarkdown keeps working inside, including **emphasis** and lists:\n\n- one\n- two\n\n</details>\n\n<dl>\n <dt>Definition list</dt>\n <dd>Rendered from raw <code>dl</code>, <code>dt</code> and <code>dd</code> tags.</dd>\n</dl>\n\n<div align="center">A centered block.</div>\n\n<!--section:Sanitized HTML-->\nMarkup outside the allow list is removed. A script tag is dropped whole —\n<script>alert(\'xss\')<\/script>leaving nothing behind.\n\nUnlisted tags are unwrapped to their text, so <mark>mark</mark> and\n<abbr title="HyperText Markup Language">abbr</abbr> keep the words but lose the\nelement. HTML comments never reach the DOM:\n\n<!-- this comment is not rendered -->\n\n<!--section:Unsupported syntax-->\n### Reference links\n\nA link reference definition is a block of its own, which the streaming parser\nnever joins back up, so [reference links][ref] and ![reference images][ref] stay\nliteral.\n\n[ref]: https://example.com\n\n### Math\n\nKaTeX arrives with the optional `@streamdown/math` plugin, which this build does\nnot install, so $E = mc^2$ and $$a^2 + b^2 = c^2$$ render as plain text.\n\n### Mermaid\n\nDiagrams need the optional `@streamdown/mermaid` plugin. Without it a `mermaid`\nfence is just another code block:\n\n```mermaid\ngraph TD;\n A[Start] --> B[Finish];\n```\n\n### Front matter\n\nYAML front matter is not stripped: the `---` delimiters parse as a thematic\nbreak followed by a setext heading.\n';
|
|
2
|
+
export {
|
|
3
|
+
source as default
|
|
4
|
+
};
|
|
5
|
+
//# sourceMappingURL=markdown-syntax.md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-syntax.md.js","sources":["../../../src/data/examples/markdown-syntax.md?raw"],"sourcesContent":["export default \"<!--section:Headings-->\\n# Heading level 1\\n\\n## Heading level 2\\n\\n### Heading level 3\\n\\n#### Heading level 4\\n\\n##### Heading level 5\\n\\n###### Heading level 6\\n\\nSetext level 1\\n==============\\n\\nSetext level 2\\n--------------\\n\\n<!--section:Paragraphs and line breaks-->\\nA paragraph is one or more lines of text. Source lines that are merely wrapped\\njoin back into a single line when rendered.\\n\\nTwo trailing spaces force a hard break, \\nso this continues on its own line. A trailing backslash does the same,\\\\\\nand so does this one.\\n\\n<!--section:Emphasis and inline styles-->\\n*Single asterisks* and _single underscores_ mark emphasis. **Double asterisks**\\nand __double underscores__ mark strong text, and ***the two together*** combine\\nthem. GFM adds ~~strikethrough~~.\\n\\nInline `code` uses single backticks. ``A span containing a ` backtick`` doubles\\nthe fence.\\n\\n<!--section:Escapes and entities-->\\nBackslash escapes keep markdown punctuation literal: \\\\*not emphasis\\\\*,\\n\\\\_not emphasis\\\\_, \\\\`not code\\\\`, and \\\\# not a heading.\\n\\nNamed and numeric HTML entities resolve: © 2026, A & B, an em dash\\n— an ellipsis … and a non-breaking space.\\n\\n<!--section:Lists-->\\n- A bullet item\\n- Another bullet item\\n - Nested one level\\n - Nested two levels\\n- Back to the top level\\n\\nThe `-`, `*`, and `+` markers are interchangeable.\\n\\n1. An ordered item\\n2. Another ordered item\\n 1. Nested one level\\n 2. Still nested\\n3. Back to the top level\\n\\nOnly the first number matters; the rest are renumbered on render.\\n\\n1. A list item holds any block content while its continuation stays indented.\\n\\n ```bash\\n pnpm --filter @flanksource/clicky-ui build\\n ```\\n\\n2. Blank lines between items make the list loose, so every item is wrapped in a\\n paragraph of its own.\\n\\n<!--section:Task lists-->\\n- [x] A completed task\\n- [ ] An outstanding task\\n- [ ] A task with **emphasis**, `code`, and a [link](https://example.com)\\n\\n<!--section:Links-->\\nAn [inline link](https://example.com), one\\n[with a title](https://example.com \\\"Shown on hover\\\"), and one pointing at\\n[a page fragment](#tables).\\n\\nAngle autolinks render their target: <https://example.com>.\\n\\nGFM literal autolinks need no markup at all — https://example.com,\\nwww.example.com, and hello@example.com all become links.\\n\\n<!--section:Images-->\\n\\n\\nRelative and `http(s)` sources render. Inline `data:` sources are refused by the\\nsanitizer, which substitutes a placeholder:\\n\\n\\n\\n<!--section:Blockquotes-->\\n> A single-level quote.\\n\\n> A quote carries any block content:\\n>\\n> - a list,\\n> - **inline formatting**,\\n>\\n> > and a nested quote.\\n\\n<!--section:Code-->\\nA fence with a language hint renders through the library `CodeBlock`, which adds\\ncopy, download, and per-block theme controls:\\n\\n```ts\\nexport function greet(name: string): string {\\n return `Hello, ${name}`;\\n}\\n```\\n\\nA fence with no language falls back to plain text:\\n\\n```\\nNo language hint here.\\n```\\n\\nFour-space indentation also opens a code block:\\n\\n indented code block\\n second line\\n\\n<!--section:Tables-->\\nThe delimiter row sets column alignment — `:--` left, `:-:` center, `--:` right.\\n\\n| Feature | Supported | Since |\\n| :-------- | :-------: | -----: |\\n| Tables | yes | GFM |\\n| Alignment | yes | GFM |\\n| Footnotes | yes | GFM |\\n\\nCells take inline formatting, escape a literal pipe as `\\\\|`, and may be empty.\\n\\n| Cell | Renders |\\n| ----------- | ---------------------------- |\\n| formatting | **bold**, `code`, ~~struck~~ |\\n| escaped bar | a \\\\| b |\\n| empty | |\\n\\n<!--section:Footnotes-->\\nFootnotes are a GFM extension[^1]; labels may be words[^label], and the\\ndefinitions collect at the end of the rendered block wherever they are written.\\n\\n[^1]: A numbered footnote definition.\\n[^label]: Definitions are ordered by first reference, not by label.\\n\\n<!--section:Thematic breaks-->\\nThree or more hyphens, asterisks, or underscores alone on a line draw a rule.\\n\\n---\\n\\n***\\n\\n___\\n\\n<!--section:Inline HTML-->\\nRaw HTML inside the allow list passes through: press <kbd>Ctrl</kbd>+<kbd>C</kbd>,\\nwrite H<sub>2</sub>O and E=mc<sup>2</sup>, mark text <ins>inserted</ins> or\\n<del>deleted</del>, and break a line<br />like this.\\n\\n<details>\\n<summary>A collapsible section</summary>\\n\\nMarkdown keeps working inside, including **emphasis** and lists:\\n\\n- one\\n- two\\n\\n</details>\\n\\n<dl>\\n <dt>Definition list</dt>\\n <dd>Rendered from raw <code>dl</code>, <code>dt</code> and <code>dd</code> tags.</dd>\\n</dl>\\n\\n<div align=\\\"center\\\">A centered block.</div>\\n\\n<!--section:Sanitized HTML-->\\nMarkup outside the allow list is removed. A script tag is dropped whole —\\n<script>alert('xss')</script>leaving nothing behind.\\n\\nUnlisted tags are unwrapped to their text, so <mark>mark</mark> and\\n<abbr title=\\\"HyperText Markup Language\\\">abbr</abbr> keep the words but lose the\\nelement. HTML comments never reach the DOM:\\n\\n<!-- this comment is not rendered -->\\n\\n<!--section:Unsupported syntax-->\\n### Reference links\\n\\nA link reference definition is a block of its own, which the streaming parser\\nnever joins back up, so [reference links][ref] and ![reference images][ref] stay\\nliteral.\\n\\n[ref]: https://example.com\\n\\n### Math\\n\\nKaTeX arrives with the optional `@streamdown/math` plugin, which this build does\\nnot install, so $E = mc^2$ and $$a^2 + b^2 = c^2$$ render as plain text.\\n\\n### Mermaid\\n\\nDiagrams need the optional `@streamdown/mermaid` plugin. Without it a `mermaid`\\nfence is just another code block:\\n\\n```mermaid\\ngraph TD;\\n A[Start] --> B[Finish];\\n```\\n\\n### Front matter\\n\\nYAML front matter is not stripped: the `---` delimiters parse as a thematic\\nbreak followed by a setext heading.\\n\""],"names":[],"mappings":"AAAA,MAAA,SAAe;"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const METRIC_LABELS = {
|
|
4
|
+
total: "Total",
|
|
5
|
+
command: "Command",
|
|
6
|
+
format: "Format response",
|
|
7
|
+
sql: "SQL",
|
|
8
|
+
redis: "Redis"
|
|
9
|
+
};
|
|
10
|
+
const COUNTER_LABELS = {
|
|
11
|
+
queries: ["query", "queries"],
|
|
12
|
+
rows_returned: ["row returned", "rows returned"],
|
|
13
|
+
rows_scanned: ["row scanned", "rows scanned"],
|
|
14
|
+
ops: ["operation", "operations"],
|
|
15
|
+
hits: ["hit", "hits"],
|
|
16
|
+
misses: ["miss", "misses"],
|
|
17
|
+
errors: ["error", "errors"]
|
|
18
|
+
};
|
|
19
|
+
function splitOutsideQuotes(value, delimiter) {
|
|
20
|
+
const parts = [];
|
|
21
|
+
let start = 0;
|
|
22
|
+
let quoted = false;
|
|
23
|
+
let escaped = false;
|
|
24
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
25
|
+
const character = value[index];
|
|
26
|
+
if (escaped) {
|
|
27
|
+
escaped = false;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (quoted && character === "\\") {
|
|
31
|
+
escaped = true;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (character === '"') {
|
|
35
|
+
quoted = !quoted;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (!quoted && character === delimiter) {
|
|
39
|
+
parts.push(value.slice(start, index).trim());
|
|
40
|
+
start = index + 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
parts.push(value.slice(start).trim());
|
|
44
|
+
return parts.filter(Boolean);
|
|
45
|
+
}
|
|
46
|
+
function decodeParameterValue(value) {
|
|
47
|
+
if (!value.startsWith('"') || !value.endsWith('"')) return value;
|
|
48
|
+
return value.slice(1, -1).replace(/\\(["\\])/g, "$1");
|
|
49
|
+
}
|
|
50
|
+
function parseCounters(description) {
|
|
51
|
+
if (!description) return {};
|
|
52
|
+
const counters = {};
|
|
53
|
+
const pattern = /(?:^|\s)([A-Za-z][A-Za-z0-9_.-]*)=(-?\d+(?:\.\d+)?)(?=\s|$)/g;
|
|
54
|
+
for (const match of description.matchAll(pattern)) {
|
|
55
|
+
const name = match[1];
|
|
56
|
+
const rawValue = match[2];
|
|
57
|
+
if (!name || !rawValue) continue;
|
|
58
|
+
const value = Number(rawValue);
|
|
59
|
+
if (Number.isFinite(value)) counters[name] = value;
|
|
60
|
+
}
|
|
61
|
+
return counters;
|
|
62
|
+
}
|
|
63
|
+
function humanize(value) {
|
|
64
|
+
const words = value.replace(/[_-]+/g, " ").trim();
|
|
65
|
+
return words ? words[0].toUpperCase() + words.slice(1) : value;
|
|
66
|
+
}
|
|
67
|
+
function parseServerTiming(header) {
|
|
68
|
+
if (!(header == null ? void 0 : header.trim())) return [];
|
|
69
|
+
return splitOutsideQuotes(header, ",").flatMap((entry) => {
|
|
70
|
+
const tokens = splitOutsideQuotes(entry, ";");
|
|
71
|
+
const name = tokens[0];
|
|
72
|
+
if (!name) return [];
|
|
73
|
+
let duration = 0;
|
|
74
|
+
let description;
|
|
75
|
+
let durationSeen = false;
|
|
76
|
+
for (const token of tokens.slice(1)) {
|
|
77
|
+
const separator = token.indexOf("=");
|
|
78
|
+
if (separator < 0) continue;
|
|
79
|
+
const key = token.slice(0, separator).trim().toLowerCase();
|
|
80
|
+
const value = decodeParameterValue(token.slice(separator + 1).trim());
|
|
81
|
+
if (key === "desc" && description === void 0) description = value;
|
|
82
|
+
if (key === "dur" && !durationSeen) {
|
|
83
|
+
durationSeen = true;
|
|
84
|
+
const parsed = Number(value);
|
|
85
|
+
if (Number.isFinite(parsed) && parsed >= 0) duration = parsed;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return [{
|
|
89
|
+
name,
|
|
90
|
+
duration,
|
|
91
|
+
counters: parseCounters(description),
|
|
92
|
+
...description !== void 0 ? { description } : {}
|
|
93
|
+
}];
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function formatServerTimingDuration(milliseconds) {
|
|
97
|
+
if (milliseconds >= 1e3) return `${(milliseconds / 1e3).toFixed(1)} s`;
|
|
98
|
+
if (milliseconds < 10) return `${milliseconds.toFixed(1)} ms`;
|
|
99
|
+
return `${Math.round(milliseconds)} ms`;
|
|
100
|
+
}
|
|
101
|
+
function serverTimingMetricLabel(metric) {
|
|
102
|
+
if (metric.description && Object.keys(metric.counters).length === 0) {
|
|
103
|
+
return metric.description;
|
|
104
|
+
}
|
|
105
|
+
return METRIC_LABELS[metric.name] ?? humanize(metric.name);
|
|
106
|
+
}
|
|
107
|
+
function serverTimingCounterSummary(metric) {
|
|
108
|
+
const counters = Object.entries(metric.counters);
|
|
109
|
+
if (counters.length === 0) return void 0;
|
|
110
|
+
return counters.map(([name, value]) => {
|
|
111
|
+
const labels = COUNTER_LABELS[name];
|
|
112
|
+
const label = (labels == null ? void 0 : labels[Math.abs(value) === 1 ? 0 : 1]) ?? humanize(name).toLowerCase();
|
|
113
|
+
return `${value.toLocaleString("en-US")} ${label}`;
|
|
114
|
+
}).join(" · ");
|
|
115
|
+
}
|
|
116
|
+
exports.formatServerTimingDuration = formatServerTimingDuration;
|
|
117
|
+
exports.parseServerTiming = parseServerTiming;
|
|
118
|
+
exports.serverTimingCounterSummary = serverTimingCounterSummary;
|
|
119
|
+
exports.serverTimingMetricLabel = serverTimingMetricLabel;
|
|
120
|
+
//# sourceMappingURL=server-timing.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-timing.cjs","sources":["../../src/data/server-timing.ts"],"sourcesContent":["export interface ServerTimingMetric {\n name: string;\n duration: number;\n description?: string;\n counters: Record<string, number>;\n}\n\nconst METRIC_LABELS: Record<string, string> = {\n total: \"Total\",\n command: \"Command\",\n format: \"Format response\",\n sql: \"SQL\",\n redis: \"Redis\",\n};\n\nconst COUNTER_LABELS: Record<string, readonly [singular: string, plural: string]> = {\n queries: [\"query\", \"queries\"],\n rows_returned: [\"row returned\", \"rows returned\"],\n rows_scanned: [\"row scanned\", \"rows scanned\"],\n ops: [\"operation\", \"operations\"],\n hits: [\"hit\", \"hits\"],\n misses: [\"miss\", \"misses\"],\n errors: [\"error\", \"errors\"],\n};\n\nfunction splitOutsideQuotes(value: string, delimiter: \",\" | \";\"): string[] {\n const parts: string[] = [];\n let start = 0;\n let quoted = false;\n let escaped = false;\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (quoted && character === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (character === '\"') {\n quoted = !quoted;\n continue;\n }\n if (!quoted && character === delimiter) {\n parts.push(value.slice(start, index).trim());\n start = index + 1;\n }\n }\n parts.push(value.slice(start).trim());\n return parts.filter(Boolean);\n}\n\nfunction decodeParameterValue(value: string): string {\n if (!value.startsWith('\"') || !value.endsWith('\"')) return value;\n return value.slice(1, -1).replace(/\\\\([\"\\\\])/g, \"$1\");\n}\n\nfunction parseCounters(description: string | undefined): Record<string, number> {\n if (!description) return {};\n const counters: Record<string, number> = {};\n const pattern = /(?:^|\\s)([A-Za-z][A-Za-z0-9_.-]*)=(-?\\d+(?:\\.\\d+)?)(?=\\s|$)/g;\n for (const match of description.matchAll(pattern)) {\n const name = match[1];\n const rawValue = match[2];\n if (!name || !rawValue) continue;\n const value = Number(rawValue);\n if (Number.isFinite(value)) counters[name] = value;\n }\n return counters;\n}\n\nfunction humanize(value: string): string {\n const words = value.replace(/[_-]+/g, \" \").trim();\n return words ? words[0]!.toUpperCase() + words.slice(1) : value;\n}\n\nexport function parseServerTiming(\n header: string | null | undefined,\n): ServerTimingMetric[] {\n if (!header?.trim()) return [];\n return splitOutsideQuotes(header, \",\").flatMap((entry) => {\n const tokens = splitOutsideQuotes(entry, \";\");\n const name = tokens[0];\n if (!name) return [];\n let duration = 0;\n let description: string | undefined;\n let durationSeen = false;\n for (const token of tokens.slice(1)) {\n const separator = token.indexOf(\"=\");\n if (separator < 0) continue;\n const key = token.slice(0, separator).trim().toLowerCase();\n const value = decodeParameterValue(token.slice(separator + 1).trim());\n // Server-Timing keeps the first instance of a duplicated parameter name\n // within one metric and ignores the rest.\n if (key === \"desc\" && description === undefined) description = value;\n if (key === \"dur\" && !durationSeen) {\n durationSeen = true;\n const parsed = Number(value);\n if (Number.isFinite(parsed) && parsed >= 0) duration = parsed;\n }\n }\n return [{\n name,\n duration,\n counters: parseCounters(description),\n ...(description !== undefined ? { description } : {}),\n }];\n });\n}\n\nexport function formatServerTimingDuration(milliseconds: number): string {\n if (milliseconds >= 1000) return `${(milliseconds / 1000).toFixed(1)} s`;\n if (milliseconds < 10) return `${milliseconds.toFixed(1)} ms`;\n return `${Math.round(milliseconds)} ms`;\n}\n\nexport function serverTimingMetricLabel(metric: ServerTimingMetric): string {\n if (metric.description && Object.keys(metric.counters).length === 0) {\n return metric.description;\n }\n return METRIC_LABELS[metric.name] ?? humanize(metric.name);\n}\n\nexport function serverTimingCounterSummary(metric: ServerTimingMetric): string | undefined {\n const counters = Object.entries(metric.counters);\n if (counters.length === 0) return undefined;\n return counters\n .map(([name, value]) => {\n const labels = COUNTER_LABELS[name];\n const label = labels?.[Math.abs(value) === 1 ? 0 : 1] ?? humanize(name).toLowerCase();\n return `${value.toLocaleString(\"en-US\")} ${label}`;\n })\n .join(\" · \");\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ServerTimingMetric {
|
|
2
|
+
name: string;
|
|
3
|
+
duration: number;
|
|
4
|
+
description?: string;
|
|
5
|
+
counters: Record<string, number>;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseServerTiming(header: string | null | undefined): ServerTimingMetric[];
|
|
8
|
+
export declare function formatServerTimingDuration(milliseconds: number): string;
|
|
9
|
+
export declare function serverTimingMetricLabel(metric: ServerTimingMetric): string;
|
|
10
|
+
export declare function serverTimingCounterSummary(metric: ServerTimingMetric): string | undefined;
|
|
11
|
+
//# sourceMappingURL=server-timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-timing.d.ts","sourceRoot":"","sources":["../../src/data/server-timing.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAyED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,kBAAkB,EAAE,CA8BtB;AAED,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAK1E;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAUzF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
const METRIC_LABELS = {
|
|
2
|
+
total: "Total",
|
|
3
|
+
command: "Command",
|
|
4
|
+
format: "Format response",
|
|
5
|
+
sql: "SQL",
|
|
6
|
+
redis: "Redis"
|
|
7
|
+
};
|
|
8
|
+
const COUNTER_LABELS = {
|
|
9
|
+
queries: ["query", "queries"],
|
|
10
|
+
rows_returned: ["row returned", "rows returned"],
|
|
11
|
+
rows_scanned: ["row scanned", "rows scanned"],
|
|
12
|
+
ops: ["operation", "operations"],
|
|
13
|
+
hits: ["hit", "hits"],
|
|
14
|
+
misses: ["miss", "misses"],
|
|
15
|
+
errors: ["error", "errors"]
|
|
16
|
+
};
|
|
17
|
+
function splitOutsideQuotes(value, delimiter) {
|
|
18
|
+
const parts = [];
|
|
19
|
+
let start = 0;
|
|
20
|
+
let quoted = false;
|
|
21
|
+
let escaped = false;
|
|
22
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
23
|
+
const character = value[index];
|
|
24
|
+
if (escaped) {
|
|
25
|
+
escaped = false;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (quoted && character === "\\") {
|
|
29
|
+
escaped = true;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (character === '"') {
|
|
33
|
+
quoted = !quoted;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (!quoted && character === delimiter) {
|
|
37
|
+
parts.push(value.slice(start, index).trim());
|
|
38
|
+
start = index + 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
parts.push(value.slice(start).trim());
|
|
42
|
+
return parts.filter(Boolean);
|
|
43
|
+
}
|
|
44
|
+
function decodeParameterValue(value) {
|
|
45
|
+
if (!value.startsWith('"') || !value.endsWith('"')) return value;
|
|
46
|
+
return value.slice(1, -1).replace(/\\(["\\])/g, "$1");
|
|
47
|
+
}
|
|
48
|
+
function parseCounters(description) {
|
|
49
|
+
if (!description) return {};
|
|
50
|
+
const counters = {};
|
|
51
|
+
const pattern = /(?:^|\s)([A-Za-z][A-Za-z0-9_.-]*)=(-?\d+(?:\.\d+)?)(?=\s|$)/g;
|
|
52
|
+
for (const match of description.matchAll(pattern)) {
|
|
53
|
+
const name = match[1];
|
|
54
|
+
const rawValue = match[2];
|
|
55
|
+
if (!name || !rawValue) continue;
|
|
56
|
+
const value = Number(rawValue);
|
|
57
|
+
if (Number.isFinite(value)) counters[name] = value;
|
|
58
|
+
}
|
|
59
|
+
return counters;
|
|
60
|
+
}
|
|
61
|
+
function humanize(value) {
|
|
62
|
+
const words = value.replace(/[_-]+/g, " ").trim();
|
|
63
|
+
return words ? words[0].toUpperCase() + words.slice(1) : value;
|
|
64
|
+
}
|
|
65
|
+
function parseServerTiming(header) {
|
|
66
|
+
if (!(header == null ? void 0 : header.trim())) return [];
|
|
67
|
+
return splitOutsideQuotes(header, ",").flatMap((entry) => {
|
|
68
|
+
const tokens = splitOutsideQuotes(entry, ";");
|
|
69
|
+
const name = tokens[0];
|
|
70
|
+
if (!name) return [];
|
|
71
|
+
let duration = 0;
|
|
72
|
+
let description;
|
|
73
|
+
let durationSeen = false;
|
|
74
|
+
for (const token of tokens.slice(1)) {
|
|
75
|
+
const separator = token.indexOf("=");
|
|
76
|
+
if (separator < 0) continue;
|
|
77
|
+
const key = token.slice(0, separator).trim().toLowerCase();
|
|
78
|
+
const value = decodeParameterValue(token.slice(separator + 1).trim());
|
|
79
|
+
if (key === "desc" && description === void 0) description = value;
|
|
80
|
+
if (key === "dur" && !durationSeen) {
|
|
81
|
+
durationSeen = true;
|
|
82
|
+
const parsed = Number(value);
|
|
83
|
+
if (Number.isFinite(parsed) && parsed >= 0) duration = parsed;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return [{
|
|
87
|
+
name,
|
|
88
|
+
duration,
|
|
89
|
+
counters: parseCounters(description),
|
|
90
|
+
...description !== void 0 ? { description } : {}
|
|
91
|
+
}];
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function formatServerTimingDuration(milliseconds) {
|
|
95
|
+
if (milliseconds >= 1e3) return `${(milliseconds / 1e3).toFixed(1)} s`;
|
|
96
|
+
if (milliseconds < 10) return `${milliseconds.toFixed(1)} ms`;
|
|
97
|
+
return `${Math.round(milliseconds)} ms`;
|
|
98
|
+
}
|
|
99
|
+
function serverTimingMetricLabel(metric) {
|
|
100
|
+
if (metric.description && Object.keys(metric.counters).length === 0) {
|
|
101
|
+
return metric.description;
|
|
102
|
+
}
|
|
103
|
+
return METRIC_LABELS[metric.name] ?? humanize(metric.name);
|
|
104
|
+
}
|
|
105
|
+
function serverTimingCounterSummary(metric) {
|
|
106
|
+
const counters = Object.entries(metric.counters);
|
|
107
|
+
if (counters.length === 0) return void 0;
|
|
108
|
+
return counters.map(([name, value]) => {
|
|
109
|
+
const labels = COUNTER_LABELS[name];
|
|
110
|
+
const label = (labels == null ? void 0 : labels[Math.abs(value) === 1 ? 0 : 1]) ?? humanize(name).toLowerCase();
|
|
111
|
+
return `${value.toLocaleString("en-US")} ${label}`;
|
|
112
|
+
}).join(" · ");
|
|
113
|
+
}
|
|
114
|
+
export {
|
|
115
|
+
formatServerTimingDuration,
|
|
116
|
+
parseServerTiming,
|
|
117
|
+
serverTimingCounterSummary,
|
|
118
|
+
serverTimingMetricLabel
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=server-timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-timing.js","sources":["../../src/data/server-timing.ts"],"sourcesContent":["export interface ServerTimingMetric {\n name: string;\n duration: number;\n description?: string;\n counters: Record<string, number>;\n}\n\nconst METRIC_LABELS: Record<string, string> = {\n total: \"Total\",\n command: \"Command\",\n format: \"Format response\",\n sql: \"SQL\",\n redis: \"Redis\",\n};\n\nconst COUNTER_LABELS: Record<string, readonly [singular: string, plural: string]> = {\n queries: [\"query\", \"queries\"],\n rows_returned: [\"row returned\", \"rows returned\"],\n rows_scanned: [\"row scanned\", \"rows scanned\"],\n ops: [\"operation\", \"operations\"],\n hits: [\"hit\", \"hits\"],\n misses: [\"miss\", \"misses\"],\n errors: [\"error\", \"errors\"],\n};\n\nfunction splitOutsideQuotes(value: string, delimiter: \",\" | \";\"): string[] {\n const parts: string[] = [];\n let start = 0;\n let quoted = false;\n let escaped = false;\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (quoted && character === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (character === '\"') {\n quoted = !quoted;\n continue;\n }\n if (!quoted && character === delimiter) {\n parts.push(value.slice(start, index).trim());\n start = index + 1;\n }\n }\n parts.push(value.slice(start).trim());\n return parts.filter(Boolean);\n}\n\nfunction decodeParameterValue(value: string): string {\n if (!value.startsWith('\"') || !value.endsWith('\"')) return value;\n return value.slice(1, -1).replace(/\\\\([\"\\\\])/g, \"$1\");\n}\n\nfunction parseCounters(description: string | undefined): Record<string, number> {\n if (!description) return {};\n const counters: Record<string, number> = {};\n const pattern = /(?:^|\\s)([A-Za-z][A-Za-z0-9_.-]*)=(-?\\d+(?:\\.\\d+)?)(?=\\s|$)/g;\n for (const match of description.matchAll(pattern)) {\n const name = match[1];\n const rawValue = match[2];\n if (!name || !rawValue) continue;\n const value = Number(rawValue);\n if (Number.isFinite(value)) counters[name] = value;\n }\n return counters;\n}\n\nfunction humanize(value: string): string {\n const words = value.replace(/[_-]+/g, \" \").trim();\n return words ? words[0]!.toUpperCase() + words.slice(1) : value;\n}\n\nexport function parseServerTiming(\n header: string | null | undefined,\n): ServerTimingMetric[] {\n if (!header?.trim()) return [];\n return splitOutsideQuotes(header, \",\").flatMap((entry) => {\n const tokens = splitOutsideQuotes(entry, \";\");\n const name = tokens[0];\n if (!name) return [];\n let duration = 0;\n let description: string | undefined;\n let durationSeen = false;\n for (const token of tokens.slice(1)) {\n const separator = token.indexOf(\"=\");\n if (separator < 0) continue;\n const key = token.slice(0, separator).trim().toLowerCase();\n const value = decodeParameterValue(token.slice(separator + 1).trim());\n // Server-Timing keeps the first instance of a duplicated parameter name\n // within one metric and ignores the rest.\n if (key === \"desc\" && description === undefined) description = value;\n if (key === \"dur\" && !durationSeen) {\n durationSeen = true;\n const parsed = Number(value);\n if (Number.isFinite(parsed) && parsed >= 0) duration = parsed;\n }\n }\n return [{\n name,\n duration,\n counters: parseCounters(description),\n ...(description !== undefined ? { description } : {}),\n }];\n });\n}\n\nexport function formatServerTimingDuration(milliseconds: number): string {\n if (milliseconds >= 1000) return `${(milliseconds / 1000).toFixed(1)} s`;\n if (milliseconds < 10) return `${milliseconds.toFixed(1)} ms`;\n return `${Math.round(milliseconds)} ms`;\n}\n\nexport function serverTimingMetricLabel(metric: ServerTimingMetric): string {\n if (metric.description && Object.keys(metric.counters).length === 0) {\n return metric.description;\n }\n return METRIC_LABELS[metric.name] ?? humanize(metric.name);\n}\n\nexport function serverTimingCounterSummary(metric: ServerTimingMetric): string | undefined {\n const counters = Object.entries(metric.counters);\n if (counters.length === 0) return undefined;\n return counters\n .map(([name, value]) => {\n const labels = COUNTER_LABELS[name];\n const label = labels?.[Math.abs(value) === 1 ? 0 : 1] ?? humanize(name).toLowerCase();\n return `${value.toLocaleString(\"en-US\")} ${label}`;\n })\n .join(\" · \");\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
function isTaskProcessDetails(value) {
|
|
4
|
+
if (!value || typeof value !== "object") return false;
|
|
5
|
+
const candidate = value;
|
|
6
|
+
return typeof candidate.command === "string" && typeof candidate.status === "string" && typeof candidate.restarts === "number" && !!candidate.latest && !!candidate.peak && !!candidate.metrics;
|
|
7
|
+
}
|
|
8
|
+
function processNode(sample) {
|
|
9
|
+
return {
|
|
10
|
+
pid: sample.pid,
|
|
11
|
+
ppid: sample.ppid,
|
|
12
|
+
command: sample.command,
|
|
13
|
+
...sample.status ? { status: sample.status } : {},
|
|
14
|
+
cpu_percent: sample.cpuPercent,
|
|
15
|
+
rss: sample.rssBytes,
|
|
16
|
+
vms: sample.vmsBytes,
|
|
17
|
+
open_files: sample.openFiles,
|
|
18
|
+
is_root: sample.isRoot ?? false,
|
|
19
|
+
children: []
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function buildTaskProcessForest(samples) {
|
|
23
|
+
const byPid = /* @__PURE__ */ new Map();
|
|
24
|
+
const children = /* @__PURE__ */ new Map();
|
|
25
|
+
for (const sample of samples) {
|
|
26
|
+
if (byPid.has(sample.pid)) throw new Error(`duplicate process pid ${sample.pid}`);
|
|
27
|
+
byPid.set(sample.pid, sample);
|
|
28
|
+
children.set(sample.ppid, [...children.get(sample.ppid) ?? [], sample]);
|
|
29
|
+
}
|
|
30
|
+
const visited = /* @__PURE__ */ new Set();
|
|
31
|
+
const visit = (sample) => {
|
|
32
|
+
if (visited.has(sample.pid)) return null;
|
|
33
|
+
visited.add(sample.pid);
|
|
34
|
+
const node = processNode(sample);
|
|
35
|
+
node.children = (children.get(sample.pid) ?? []).map(visit).filter((child) => child !== null);
|
|
36
|
+
return node;
|
|
37
|
+
};
|
|
38
|
+
const roots = samples.filter((sample) => sample.isRoot || !byPid.has(sample.ppid));
|
|
39
|
+
const forest = roots.map(visit).filter((node) => node !== null);
|
|
40
|
+
for (const sample of samples) {
|
|
41
|
+
const orphan = visit(sample);
|
|
42
|
+
if (orphan) forest.push(orphan);
|
|
43
|
+
}
|
|
44
|
+
return forest;
|
|
45
|
+
}
|
|
46
|
+
exports.buildTaskProcessForest = buildTaskProcessForest;
|
|
47
|
+
exports.isTaskProcessDetails = isTaskProcessDetails;
|
|
48
|
+
//# sourceMappingURL=task-process-details.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-process-details.cjs","sources":["../../src/data/task-process-details.ts"],"sourcesContent":["import type { ProcessNode } from \"./diagnostics/types\";\nimport type { TaskProcessDetails, TaskProcessSample } from \"./TaskSnapshot\";\n\nexport function isTaskProcessDetails(value: unknown): value is TaskProcessDetails {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Partial<TaskProcessDetails>;\n return (\n typeof candidate.command === \"string\" &&\n typeof candidate.status === \"string\" &&\n typeof candidate.restarts === \"number\" &&\n !!candidate.latest &&\n !!candidate.peak &&\n !!candidate.metrics\n );\n}\n\nfunction processNode(sample: TaskProcessSample): ProcessNode {\n return {\n pid: sample.pid,\n ppid: sample.ppid,\n command: sample.command,\n ...(sample.status ? { status: sample.status } : {}),\n cpu_percent: sample.cpuPercent,\n rss: sample.rssBytes,\n vms: sample.vmsBytes,\n open_files: sample.openFiles,\n is_root: sample.isRoot ?? false,\n children: [],\n };\n}\n\n// buildTaskProcessForest deterministically projects Clicky's flat PID/PPID\n// samples into diagnostics trees. Missing parents remain roots and cycles are\n// cut at the first previously-visited PID so malformed OS snapshots stay usable.\nexport function buildTaskProcessForest(samples: TaskProcessSample[]): ProcessNode[] {\n const byPid = new Map<number, TaskProcessSample>();\n const children = new Map<number, TaskProcessSample[]>();\n for (const sample of samples) {\n if (byPid.has(sample.pid)) throw new Error(`duplicate process pid ${sample.pid}`);\n byPid.set(sample.pid, sample);\n children.set(sample.ppid, [...(children.get(sample.ppid) ?? []), sample]);\n }\n\n const visited = new Set<number>();\n const visit = (sample: TaskProcessSample): ProcessNode | null => {\n if (visited.has(sample.pid)) return null;\n visited.add(sample.pid);\n const node = processNode(sample);\n node.children = (children.get(sample.pid) ?? [])\n .map(visit)\n .filter((child): child is ProcessNode => child !== null);\n return node;\n };\n\n const roots = samples.filter((sample) => sample.isRoot || !byPid.has(sample.ppid));\n const forest = roots.map(visit).filter((node): node is ProcessNode => node !== null);\n for (const sample of samples) {\n const orphan = visit(sample);\n if (orphan) forest.push(orphan);\n }\n return forest;\n}\n"],"names":[],"mappings":";;AAGO,SAAS,qBAAqB,OAA6C;AAChF,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,YAAY,YAC7B,OAAO,UAAU,WAAW,YAC5B,OAAO,UAAU,aAAa,YAC9B,CAAC,CAAC,UAAU,UACZ,CAAC,CAAC,UAAU,QACZ,CAAC,CAAC,UAAU;AAEhB;AAEA,SAAS,YAAY,QAAwC;AAC3D,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAA,IAAW,CAAA;AAAA,IAChD,aAAa,OAAO;AAAA,IACpB,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO,UAAU;AAAA,IAC1B,UAAU,CAAA;AAAA,EAAC;AAEf;AAKO,SAAS,uBAAuB,SAA6C;AAClF,QAAM,4BAAY,IAAA;AAClB,QAAM,+BAAe,IAAA;AACrB,aAAW,UAAU,SAAS;AAC5B,QAAI,MAAM,IAAI,OAAO,GAAG,EAAG,OAAM,IAAI,MAAM,yBAAyB,OAAO,GAAG,EAAE;AAChF,UAAM,IAAI,OAAO,KAAK,MAAM;AAC5B,aAAS,IAAI,OAAO,MAAM,CAAC,GAAI,SAAS,IAAI,OAAO,IAAI,KAAK,CAAA,GAAK,MAAM,CAAC;AAAA,EAC1E;AAEA,QAAM,8BAAc,IAAA;AACpB,QAAM,QAAQ,CAAC,WAAkD;AAC/D,QAAI,QAAQ,IAAI,OAAO,GAAG,EAAG,QAAO;AACpC,YAAQ,IAAI,OAAO,GAAG;AACtB,UAAM,OAAO,YAAY,MAAM;AAC/B,SAAK,YAAY,SAAS,IAAI,OAAO,GAAG,KAAK,CAAA,GAC1C,IAAI,KAAK,EACT,OAAO,CAAC,UAAgC,UAAU,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC;AACjF,QAAM,SAAS,MAAM,IAAI,KAAK,EAAE,OAAO,CAAC,SAA8B,SAAS,IAAI;AACnF,aAAW,UAAU,SAAS;AAC5B,UAAM,SAAS,MAAM,MAAM;AAC3B,QAAI,OAAQ,QAAO,KAAK,MAAM;AAAA,EAChC;AACA,SAAO;AACT;;;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ProcessNode } from './diagnostics/types';
|
|
2
|
+
import { TaskProcessDetails, TaskProcessSample } from './TaskSnapshot';
|
|
3
|
+
export declare function isTaskProcessDetails(value: unknown): value is TaskProcessDetails;
|
|
4
|
+
export declare function buildTaskProcessForest(samples: TaskProcessSample[]): ProcessNode[];
|
|
5
|
+
//# sourceMappingURL=task-process-details.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-process-details.d.ts","sourceRoot":"","sources":["../../src/data/task-process-details.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAWhF;AAoBD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,WAAW,EAAE,CA2BlF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
function isTaskProcessDetails(value) {
|
|
2
|
+
if (!value || typeof value !== "object") return false;
|
|
3
|
+
const candidate = value;
|
|
4
|
+
return typeof candidate.command === "string" && typeof candidate.status === "string" && typeof candidate.restarts === "number" && !!candidate.latest && !!candidate.peak && !!candidate.metrics;
|
|
5
|
+
}
|
|
6
|
+
function processNode(sample) {
|
|
7
|
+
return {
|
|
8
|
+
pid: sample.pid,
|
|
9
|
+
ppid: sample.ppid,
|
|
10
|
+
command: sample.command,
|
|
11
|
+
...sample.status ? { status: sample.status } : {},
|
|
12
|
+
cpu_percent: sample.cpuPercent,
|
|
13
|
+
rss: sample.rssBytes,
|
|
14
|
+
vms: sample.vmsBytes,
|
|
15
|
+
open_files: sample.openFiles,
|
|
16
|
+
is_root: sample.isRoot ?? false,
|
|
17
|
+
children: []
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function buildTaskProcessForest(samples) {
|
|
21
|
+
const byPid = /* @__PURE__ */ new Map();
|
|
22
|
+
const children = /* @__PURE__ */ new Map();
|
|
23
|
+
for (const sample of samples) {
|
|
24
|
+
if (byPid.has(sample.pid)) throw new Error(`duplicate process pid ${sample.pid}`);
|
|
25
|
+
byPid.set(sample.pid, sample);
|
|
26
|
+
children.set(sample.ppid, [...children.get(sample.ppid) ?? [], sample]);
|
|
27
|
+
}
|
|
28
|
+
const visited = /* @__PURE__ */ new Set();
|
|
29
|
+
const visit = (sample) => {
|
|
30
|
+
if (visited.has(sample.pid)) return null;
|
|
31
|
+
visited.add(sample.pid);
|
|
32
|
+
const node = processNode(sample);
|
|
33
|
+
node.children = (children.get(sample.pid) ?? []).map(visit).filter((child) => child !== null);
|
|
34
|
+
return node;
|
|
35
|
+
};
|
|
36
|
+
const roots = samples.filter((sample) => sample.isRoot || !byPid.has(sample.ppid));
|
|
37
|
+
const forest = roots.map(visit).filter((node) => node !== null);
|
|
38
|
+
for (const sample of samples) {
|
|
39
|
+
const orphan = visit(sample);
|
|
40
|
+
if (orphan) forest.push(orphan);
|
|
41
|
+
}
|
|
42
|
+
return forest;
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
buildTaskProcessForest,
|
|
46
|
+
isTaskProcessDetails
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=task-process-details.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-process-details.js","sources":["../../src/data/task-process-details.ts"],"sourcesContent":["import type { ProcessNode } from \"./diagnostics/types\";\nimport type { TaskProcessDetails, TaskProcessSample } from \"./TaskSnapshot\";\n\nexport function isTaskProcessDetails(value: unknown): value is TaskProcessDetails {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Partial<TaskProcessDetails>;\n return (\n typeof candidate.command === \"string\" &&\n typeof candidate.status === \"string\" &&\n typeof candidate.restarts === \"number\" &&\n !!candidate.latest &&\n !!candidate.peak &&\n !!candidate.metrics\n );\n}\n\nfunction processNode(sample: TaskProcessSample): ProcessNode {\n return {\n pid: sample.pid,\n ppid: sample.ppid,\n command: sample.command,\n ...(sample.status ? { status: sample.status } : {}),\n cpu_percent: sample.cpuPercent,\n rss: sample.rssBytes,\n vms: sample.vmsBytes,\n open_files: sample.openFiles,\n is_root: sample.isRoot ?? false,\n children: [],\n };\n}\n\n// buildTaskProcessForest deterministically projects Clicky's flat PID/PPID\n// samples into diagnostics trees. Missing parents remain roots and cycles are\n// cut at the first previously-visited PID so malformed OS snapshots stay usable.\nexport function buildTaskProcessForest(samples: TaskProcessSample[]): ProcessNode[] {\n const byPid = new Map<number, TaskProcessSample>();\n const children = new Map<number, TaskProcessSample[]>();\n for (const sample of samples) {\n if (byPid.has(sample.pid)) throw new Error(`duplicate process pid ${sample.pid}`);\n byPid.set(sample.pid, sample);\n children.set(sample.ppid, [...(children.get(sample.ppid) ?? []), sample]);\n }\n\n const visited = new Set<number>();\n const visit = (sample: TaskProcessSample): ProcessNode | null => {\n if (visited.has(sample.pid)) return null;\n visited.add(sample.pid);\n const node = processNode(sample);\n node.children = (children.get(sample.pid) ?? [])\n .map(visit)\n .filter((child): child is ProcessNode => child !== null);\n return node;\n };\n\n const roots = samples.filter((sample) => sample.isRoot || !byPid.has(sample.ppid));\n const forest = roots.map(visit).filter((node): node is ProcessNode => node !== null);\n for (const sample of samples) {\n const orphan = visit(sample);\n if (orphan) forest.push(orphan);\n }\n return forest;\n}\n"],"names":[],"mappings":"AAGO,SAAS,qBAAqB,OAA6C;AAChF,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,YAAY,YAC7B,OAAO,UAAU,WAAW,YAC5B,OAAO,UAAU,aAAa,YAC9B,CAAC,CAAC,UAAU,UACZ,CAAC,CAAC,UAAU,QACZ,CAAC,CAAC,UAAU;AAEhB;AAEA,SAAS,YAAY,QAAwC;AAC3D,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAA,IAAW,CAAA;AAAA,IAChD,aAAa,OAAO;AAAA,IACpB,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO,UAAU;AAAA,IAC1B,UAAU,CAAA;AAAA,EAAC;AAEf;AAKO,SAAS,uBAAuB,SAA6C;AAClF,QAAM,4BAAY,IAAA;AAClB,QAAM,+BAAe,IAAA;AACrB,aAAW,UAAU,SAAS;AAC5B,QAAI,MAAM,IAAI,OAAO,GAAG,EAAG,OAAM,IAAI,MAAM,yBAAyB,OAAO,GAAG,EAAE;AAChF,UAAM,IAAI,OAAO,KAAK,MAAM;AAC5B,aAAS,IAAI,OAAO,MAAM,CAAC,GAAI,SAAS,IAAI,OAAO,IAAI,KAAK,CAAA,GAAK,MAAM,CAAC;AAAA,EAC1E;AAEA,QAAM,8BAAc,IAAA;AACpB,QAAM,QAAQ,CAAC,WAAkD;AAC/D,QAAI,QAAQ,IAAI,OAAO,GAAG,EAAG,QAAO;AACpC,YAAQ,IAAI,OAAO,GAAG;AACtB,UAAM,OAAO,YAAY,MAAM;AAC/B,SAAK,YAAY,SAAS,IAAI,OAAO,GAAG,KAAK,CAAA,GAC1C,IAAI,KAAK,EACT,OAAO,CAAC,UAAgC,UAAU,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC;AACjF,QAAM,SAAS,MAAM,IAAI,KAAK,EAAE,OAAO,CAAC,SAA8B,SAAS,IAAI;AACnF,aAAW,UAAU,SAAS;AAC5B,UAAM,SAAS,MAAM,MAAM;AAC3B,QAAI,OAAQ,QAAO,KAAK,MAAM;AAAA,EAChC;AACA,SAAO;AACT;"}
|
|
@@ -15,9 +15,9 @@ function detectMode() {
|
|
|
15
15
|
}
|
|
16
16
|
function getVersionInfo() {
|
|
17
17
|
return {
|
|
18
|
-
commit: read(() => "
|
|
19
|
-
tag: read(() => "clicky-ui@0.3.
|
|
20
|
-
date: read(() => "2026-07-
|
|
18
|
+
commit: read(() => "98f0a684", ""),
|
|
19
|
+
tag: read(() => "clicky-ui@0.3.16", ""),
|
|
20
|
+
date: read(() => "2026-07-31T11:11:36.897Z", ""),
|
|
21
21
|
dirty: read(() => true, false),
|
|
22
22
|
mode: detectMode()
|
|
23
23
|
};
|
|
@@ -13,9 +13,9 @@ function detectMode() {
|
|
|
13
13
|
}
|
|
14
14
|
function getVersionInfo() {
|
|
15
15
|
return {
|
|
16
|
-
commit: read(() => "
|
|
17
|
-
tag: read(() => "clicky-ui@0.3.
|
|
18
|
-
date: read(() => "2026-07-
|
|
16
|
+
commit: read(() => "98f0a684", ""),
|
|
17
|
+
tag: read(() => "clicky-ui@0.3.16", ""),
|
|
18
|
+
date: read(() => "2026-07-31T11:11:17.917Z", ""),
|
|
19
19
|
dirty: read(() => true, false),
|
|
20
20
|
mode: detectMode()
|
|
21
21
|
};
|