@apteva/apteva-kit 0.1.125 → 0.1.127

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -735,36 +735,36 @@ function parseWidgetsFromText(text) {
735
735
  // src/utils/widget-context.ts
736
736
  var WIDGET_DEFINITIONS = {
737
737
  card: {
738
- schema: "title, description?, image?, footer?, actions?: [{type, label}]",
738
+ schema: "title, description?, image?(url), footer?, actions?: [{type, label}]",
739
739
  example: '@ui:card[{"title": "Summary", "description": "Details here"}]'
740
740
  },
741
741
  list: {
742
- schema: "items: [{id, title, subtitle?, description?, image?, metadata?: {any extra data}}], actions?: [{type, label}] - metadata is sent as action payload when clicked",
742
+ schema: "items: [{id, title, subtitle?, description?, image?(url), metadata?: {\u2026}}], actions?: [{type, label}]",
743
743
  example: '@ui:list[{"items": [{"id": "1", "title": "Item", "subtitle": "Info", "metadata": {"key": "value"}}]}]'
744
744
  },
745
745
  button_group: {
746
- schema: "buttons: [{id, label, variant?}] - Use for standalone buttons only, NOT for form submits",
746
+ schema: 'buttons: [{id, label, variant?: "default"|"primary"|"danger"}]',
747
747
  example: '@ui:button_group[{"buttons": [{"id": "ok", "label": "OK"}]}]'
748
748
  },
749
749
  form: {
750
- schema: "title?, fields: [{name, type: text|password|number|select|checkbox|textarea|date, label, required?, placeholder?, options?}], actions: [{type, label}] - Button is built-in via actions, do NOT add separate button",
751
- example: '@ui:form[{"title": "Settings", "fields": [{"name": "apiKey", "type": "password", "label": "API Key", "required": true}], "actions": [{"type": "save", "label": "Save"}]}]'
750
+ schema: 'title?, fields: [{name, type: "text"|"password"|"number"|"select"|"checkbox"|"textarea"|"date", label, required?, placeholder?, options?: [{label, value}]}], actions: [{type, label}]',
751
+ example: '@ui:form[{"title": "Settings", "fields": [{"name": "key", "type": "password", "label": "API Key", "required": true}], "actions": [{"type": "save", "label": "Save"}]}]'
752
752
  },
753
753
  table: {
754
- schema: "columns: [{key, label}], rows: [...], striped?, compact?",
755
- example: '@ui:table[{"columns": [{"key": "name", "label": "Name"}], "rows": [{"name": "A"}]}]'
754
+ schema: "columns: [{key, label}], rows: [{key: value, \u2026}], striped?, compact?",
755
+ example: '@ui:table[{"columns": [{"key": "name", "label": "Name"}], "rows": [{"name": "Alice"}]}]'
756
756
  },
757
757
  image: {
758
- schema: "src, alt, caption?",
759
- example: '@ui:image[{"src": "url", "alt": "desc"}]'
758
+ schema: "src(url), alt, caption?",
759
+ example: '@ui:image[{"src": "https://example.com/img.png", "alt": "Photo"}]'
760
760
  },
761
761
  chart: {
762
- schema: "chartType: line|bar|pie, data: {labels, datasets}",
763
- example: '@ui:chart[{"chartType": "bar", "data": {"labels": ["A"], "datasets": [{"label": "X", "data": [10]}]}}]'
762
+ schema: 'chartType: "line"|"bar"|"pie", data: {labels: [...], datasets: [{label, data: [numbers]}]}',
763
+ example: '@ui:chart[{"chartType": "bar", "data": {"labels": ["Q1", "Q2"], "datasets": [{"label": "Revenue", "data": [100, 150]}]}}]'
764
764
  },
765
765
  flow: {
766
- schema: "title, subtitle?, icon?: research|schedule|analyze|deploy|recurring|automation|data, steps: [{id, label, type?, color?: blue|purple|cyan|amber|emerald|rose|indigo|orange, status?: pending|active|completed|error|skipped}] - Horizontal pipeline. Use @label for agents. Types auto-detected from label.",
767
- example: '@ui:flow[{"title": "Deploy Pipeline", "icon": "deploy", "steps": [{"id": "1", "label": "Test", "color": "cyan"}, {"id": "2", "label": "Build", "color": "amber"}, {"id": "3", "label": "Deploy", "color": "rose"}]}]'
766
+ schema: 'title, subtitle?, icon?: "research"|"schedule"|"analyze"|"deploy"|"recurring"|"automation"|"data", steps: [{id, label, color?: "blue"|"purple"|"cyan"|"amber"|"emerald"|"rose"|"indigo"|"orange", status?: "pending"|"active"|"completed"|"error"|"skipped"}]',
767
+ example: '@ui:flow[{"title": "Pipeline", "steps": [{"id": "1", "label": "Test", "color": "cyan"}, {"id": "2", "label": "Deploy", "color": "rose"}]}]'
768
768
  }
769
769
  };
770
770
  var ALL_WIDGET_TYPES = Object.keys(WIDGET_DEFINITIONS);
@@ -774,27 +774,54 @@ function generateWidgetContext(enabledWidgets) {
774
774
  const widgets = enabledWidgets || DEFAULT_WIDGET_TYPES;
775
775
  let context = `
776
776
  ## UI Widgets
777
- SYNTAX: @ui:type[{json}] - MUST use SQUARE BRACKETS [] around the JSON object.
778
- CORRECT: @ui:list[{"items": [...]}]
779
- WRONG: @ui:list{"items": [...]} (missing square brackets)
777
+
778
+ You can render interactive UI widgets inline in your responses. Use them when structured display is clearer than plain text (showing data, forms, actions, images). You may include normal text before or after a widget.
779
+
780
+ **Syntax:** \`@ui:type[{json}]\` \u2014 the JSON object MUST be wrapped in square brackets \`[]\`.
781
+
782
+ Example:
783
+ @ui:list[{"items": [{"id": "1", "title": "First item"}]}]
784
+
785
+ Do NOT wrap widgets in code blocks or backticks. Write them directly in your response text.
786
+
787
+ ### Available widgets
780
788
 
781
789
  `;
782
790
  for (const type of widgets) {
783
791
  const def = WIDGET_DEFINITIONS[type];
784
792
  if (!def) continue;
785
- context += `${type}: ${def.schema} | ${def.example}
793
+ context += `**${type}** \u2014 ${def.schema}
794
+ `;
795
+ context += ` ${def.example}
796
+
786
797
  `;
787
798
  }
788
- context += `
789
- Per-item "metadata" is sent as payload on action click.
799
+ context += `### Notes
800
+ - **actions**: the \`type\` field is a custom string you choose (e.g. "edit", "delete", "submit"). It is returned to the app when the user clicks the button.
801
+ - **metadata** on list items: any extra data attached to an item. Returned as the action payload when the user clicks that item.
802
+ - **form**: buttons are defined in \`actions\`, do NOT add a separate button_group for form submission.
803
+ - **select fields**: \`options\` is an array of \`{label, value}\` objects.
790
804
  `;
791
805
  return context;
792
806
  }
793
807
  function generateCompactWidgetContext(enabledWidgets) {
794
808
  const widgets = enabledWidgets || DEFAULT_WIDGET_TYPES;
795
- return `
796
- Widgets: @ui:type[{json}] - MUST use square brackets []. Example: @ui:list[{"items": [...]}]. Types: ${widgets.join(", ")}. Per-item "metadata" is sent as action payload.
809
+ let context = `
810
+ ## UI Widgets
811
+ Render widgets inline: \`@ui:type[{json}]\` (square brackets required, no code blocks).
812
+ Use when structured display is clearer than plain text. Normal text can surround widgets.
813
+
814
+ `;
815
+ for (const type of widgets) {
816
+ const def = WIDGET_DEFINITIONS[type];
817
+ if (!def) continue;
818
+ context += `**${type}**: ${def.schema}
797
819
  `;
820
+ }
821
+ context += `
822
+ actions.type = custom string returned on click. list metadata = payload on item click. form buttons go in actions, not button_group.
823
+ `;
824
+ return context;
798
825
  }
799
826
 
800
827
  // src/utils/interface-parser.ts