@dxos/plugin-observability 0.8.4-main.f5c0578 → 0.8.4-main.fcc0d83b33

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.
Files changed (207) hide show
  1. package/dist/lib/browser/ObservabilitySettings-H6UKYDDT.mjs +27 -0
  2. package/dist/lib/browser/ObservabilitySettings-H6UKYDDT.mjs.map +7 -0
  3. package/dist/lib/browser/capture-user-feedback-3BXDUCZM.mjs +24 -0
  4. package/dist/lib/browser/capture-user-feedback-3BXDUCZM.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-DLBA63VM.mjs +83 -0
  6. package/dist/lib/browser/chunk-DLBA63VM.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  8. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-VQC6DG6V.mjs +53 -0
  10. package/dist/lib/browser/chunk-VQC6DG6V.mjs.map +7 -0
  11. package/dist/lib/browser/cli/index.mjs +20 -0
  12. package/dist/lib/browser/cli/index.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +105 -114
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/operations/index.mjs +15 -0
  17. package/dist/lib/browser/operations/index.mjs.map +7 -0
  18. package/dist/lib/browser/send-event-F3D32CJX.mjs +22 -0
  19. package/dist/lib/browser/send-event-F3D32CJX.mjs.map +7 -0
  20. package/dist/lib/browser/toggle-PPNDFGWJ.mjs +47 -0
  21. package/dist/lib/browser/toggle-PPNDFGWJ.mjs.map +7 -0
  22. package/dist/lib/browser/translations.mjs +33 -0
  23. package/dist/lib/browser/translations.mjs.map +7 -0
  24. package/dist/lib/browser/types/index.mjs +12 -6
  25. package/dist/lib/node-esm/ObservabilitySettings-HXTWPHHR.mjs +28 -0
  26. package/dist/lib/node-esm/ObservabilitySettings-HXTWPHHR.mjs.map +7 -0
  27. package/dist/lib/node-esm/capture-user-feedback-LUPWJWGK.mjs +25 -0
  28. package/dist/lib/node-esm/capture-user-feedback-LUPWJWGK.mjs.map +7 -0
  29. package/dist/lib/node-esm/chunk-3B7HMSKM.mjs +84 -0
  30. package/dist/lib/node-esm/chunk-3B7HMSKM.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  32. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  33. package/dist/lib/node-esm/chunk-NCIKZY6L.mjs +54 -0
  34. package/dist/lib/node-esm/chunk-NCIKZY6L.mjs.map +7 -0
  35. package/dist/lib/node-esm/cli/index.mjs +21 -0
  36. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  37. package/dist/lib/node-esm/index.mjs +105 -114
  38. package/dist/lib/node-esm/index.mjs.map +4 -4
  39. package/dist/lib/node-esm/meta.json +1 -1
  40. package/dist/lib/node-esm/operations/index.mjs +16 -0
  41. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  42. package/dist/lib/node-esm/send-event-OKTEXC7M.mjs +23 -0
  43. package/dist/lib/node-esm/send-event-OKTEXC7M.mjs.map +7 -0
  44. package/dist/lib/node-esm/toggle-YS2KFMXS.mjs +48 -0
  45. package/dist/lib/node-esm/toggle-YS2KFMXS.mjs.map +7 -0
  46. package/dist/lib/node-esm/translations.mjs +34 -0
  47. package/dist/lib/node-esm/translations.mjs.map +7 -0
  48. package/dist/lib/node-esm/types/index.mjs +12 -6
  49. package/dist/types/src/ObservabilityPlugin.d.ts +10 -3
  50. package/dist/types/src/ObservabilityPlugin.d.ts.map +1 -1
  51. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  52. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  53. package/dist/types/src/capabilities/client-ready.d.ts +5 -5
  54. package/dist/types/src/capabilities/client-ready.d.ts.map +1 -1
  55. package/dist/types/src/capabilities/index.d.ts +16 -15
  56. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  57. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  58. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  59. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  60. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  61. package/dist/types/src/capabilities/settings.d.ts +5 -2
  62. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/state.d.ts +10 -3
  64. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  65. package/dist/types/src/cli/index.d.ts +2 -0
  66. package/dist/types/src/cli/index.d.ts.map +1 -0
  67. package/dist/types/src/cli/plugin.d.ts +3 -0
  68. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  69. package/dist/types/src/components/FeedbackForm/FeedbackForm.d.ts +9 -0
  70. package/dist/types/src/components/FeedbackForm/FeedbackForm.d.ts.map +1 -0
  71. package/dist/types/src/components/FeedbackForm/FeedbackForm.stories.d.ts +36 -0
  72. package/dist/types/src/components/FeedbackForm/FeedbackForm.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/FeedbackForm/index.d.ts +2 -0
  74. package/dist/types/src/components/FeedbackForm/index.d.ts.map +1 -0
  75. package/dist/types/src/components/ObservabilitySettings/ObservabilitySettings.d.ts +6 -0
  76. package/dist/types/src/components/ObservabilitySettings/ObservabilitySettings.d.ts.map +1 -0
  77. package/dist/types/src/components/ObservabilitySettings/ObservabilitySettings.stories.d.ts +36 -0
  78. package/dist/types/src/components/ObservabilitySettings/ObservabilitySettings.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/ObservabilitySettings/index.d.ts +2 -0
  80. package/dist/types/src/components/ObservabilitySettings/index.d.ts.map +1 -0
  81. package/dist/types/src/components/index.d.ts +2 -2
  82. package/dist/types/src/components/index.d.ts.map +1 -1
  83. package/dist/types/src/containers/HelpContainer/HelpContainer.d.ts +4 -0
  84. package/dist/types/src/containers/HelpContainer/HelpContainer.d.ts.map +1 -0
  85. package/dist/types/src/containers/HelpContainer/index.d.ts +2 -0
  86. package/dist/types/src/containers/HelpContainer/index.d.ts.map +1 -0
  87. package/dist/types/src/containers/index.d.ts +3 -0
  88. package/dist/types/src/containers/index.d.ts.map +1 -0
  89. package/dist/types/src/index.d.ts +1 -2
  90. package/dist/types/src/index.d.ts.map +1 -1
  91. package/dist/types/src/meta.d.ts +2 -3
  92. package/dist/types/src/meta.d.ts.map +1 -1
  93. package/dist/types/src/operations/capture-user-feedback.d.ts +5 -0
  94. package/dist/types/src/operations/capture-user-feedback.d.ts.map +1 -0
  95. package/dist/types/src/operations/definitions.d.ts +23 -0
  96. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  97. package/dist/types/src/operations/index.d.ts +5 -0
  98. package/dist/types/src/operations/index.d.ts.map +1 -0
  99. package/dist/types/src/operations/send-event.d.ts +5 -0
  100. package/dist/types/src/operations/send-event.d.ts.map +1 -0
  101. package/dist/types/src/operations/toggle.d.ts +5 -0
  102. package/dist/types/src/operations/toggle.d.ts.map +1 -0
  103. package/dist/types/src/translations.d.ts +17 -16
  104. package/dist/types/src/translations.d.ts.map +1 -1
  105. package/dist/types/src/types/Settings.d.ts +7 -0
  106. package/dist/types/src/types/Settings.d.ts.map +1 -0
  107. package/dist/types/src/types/capabilities.d.ts +31 -0
  108. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  109. package/dist/types/src/types/events.d.ts +6 -0
  110. package/dist/types/src/types/events.d.ts.map +1 -0
  111. package/dist/types/src/types/index.d.ts +3 -1
  112. package/dist/types/src/types/index.d.ts.map +1 -1
  113. package/dist/types/tsconfig.tsbuildinfo +1 -1
  114. package/package.json +68 -42
  115. package/src/ObservabilityPlugin.ts +72 -54
  116. package/src/capabilities/app-graph-builder.ts +28 -37
  117. package/src/capabilities/client-ready.ts +88 -79
  118. package/src/capabilities/index.ts +12 -8
  119. package/src/capabilities/operation-handler.ts +16 -0
  120. package/src/capabilities/react-surface.tsx +33 -19
  121. package/src/capabilities/settings.ts +26 -14
  122. package/src/capabilities/state.ts +20 -13
  123. package/src/cli/index.ts +5 -0
  124. package/src/cli/plugin.ts +31 -0
  125. package/src/components/FeedbackForm/FeedbackForm.stories.tsx +44 -0
  126. package/src/components/FeedbackForm/FeedbackForm.tsx +49 -0
  127. package/src/components/FeedbackForm/index.ts +5 -0
  128. package/src/components/ObservabilitySettings/ObservabilitySettings.stories.tsx +34 -0
  129. package/src/components/ObservabilitySettings/ObservabilitySettings.tsx +34 -0
  130. package/src/components/ObservabilitySettings/index.ts +5 -0
  131. package/src/components/index.ts +4 -2
  132. package/src/containers/HelpContainer/HelpContainer.tsx +57 -0
  133. package/src/containers/HelpContainer/index.ts +5 -0
  134. package/src/containers/index.ts +7 -0
  135. package/src/index.ts +1 -2
  136. package/src/meta.ts +8 -5
  137. package/src/operations/capture-user-feedback.ts +22 -0
  138. package/src/operations/definitions.ts +76 -0
  139. package/src/operations/index.ts +14 -0
  140. package/src/operations/send-event.ts +24 -0
  141. package/src/operations/toggle.ts +47 -0
  142. package/src/translations.ts +17 -16
  143. package/src/types/Settings.ts +22 -0
  144. package/src/types/capabilities.ts +44 -0
  145. package/src/types/events.ts +15 -0
  146. package/src/types/index.ts +3 -1
  147. package/dist/lib/browser/app-graph-builder-2SLFJVUL.mjs +0 -43
  148. package/dist/lib/browser/app-graph-builder-2SLFJVUL.mjs.map +0 -7
  149. package/dist/lib/browser/chunk-57RVSKYP.mjs +0 -13
  150. package/dist/lib/browser/chunk-57RVSKYP.mjs.map +0 -7
  151. package/dist/lib/browser/chunk-AL5RST75.mjs +0 -191
  152. package/dist/lib/browser/chunk-AL5RST75.mjs.map +0 -7
  153. package/dist/lib/browser/chunk-EAA6E4FU.mjs +0 -175
  154. package/dist/lib/browser/chunk-EAA6E4FU.mjs.map +0 -7
  155. package/dist/lib/browser/chunk-UUOBAWT2.mjs +0 -18
  156. package/dist/lib/browser/chunk-UUOBAWT2.mjs.map +0 -7
  157. package/dist/lib/browser/client-ready-NBJRF7OJ.mjs +0 -102
  158. package/dist/lib/browser/client-ready-NBJRF7OJ.mjs.map +0 -7
  159. package/dist/lib/browser/intent-resolver-NPEP5KJQ.mjs +0 -77
  160. package/dist/lib/browser/intent-resolver-NPEP5KJQ.mjs.map +0 -7
  161. package/dist/lib/browser/react-surface-245UEKB5.mjs +0 -32
  162. package/dist/lib/browser/react-surface-245UEKB5.mjs.map +0 -7
  163. package/dist/lib/browser/settings-4WW5E4VA.mjs +0 -25
  164. package/dist/lib/browser/settings-4WW5E4VA.mjs.map +0 -7
  165. package/dist/lib/browser/state-N7RLB477.mjs +0 -26
  166. package/dist/lib/browser/state-N7RLB477.mjs.map +0 -7
  167. package/dist/lib/node-esm/app-graph-builder-MMH6BVY4.mjs +0 -44
  168. package/dist/lib/node-esm/app-graph-builder-MMH6BVY4.mjs.map +0 -7
  169. package/dist/lib/node-esm/chunk-5W5V4TVX.mjs +0 -192
  170. package/dist/lib/node-esm/chunk-5W5V4TVX.mjs.map +0 -7
  171. package/dist/lib/node-esm/chunk-7XR7KMAA.mjs +0 -15
  172. package/dist/lib/node-esm/chunk-7XR7KMAA.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-D6QRS2CR.mjs +0 -176
  174. package/dist/lib/node-esm/chunk-D6QRS2CR.mjs.map +0 -7
  175. package/dist/lib/node-esm/chunk-JTKEM7PT.mjs +0 -19
  176. package/dist/lib/node-esm/chunk-JTKEM7PT.mjs.map +0 -7
  177. package/dist/lib/node-esm/client-ready-XDI3JWUY.mjs +0 -103
  178. package/dist/lib/node-esm/client-ready-XDI3JWUY.mjs.map +0 -7
  179. package/dist/lib/node-esm/intent-resolver-OH4MMH5I.mjs +0 -78
  180. package/dist/lib/node-esm/intent-resolver-OH4MMH5I.mjs.map +0 -7
  181. package/dist/lib/node-esm/react-surface-ZR3IU2ZM.mjs +0 -33
  182. package/dist/lib/node-esm/react-surface-ZR3IU2ZM.mjs.map +0 -7
  183. package/dist/lib/node-esm/settings-BKKLNOFT.mjs +0 -26
  184. package/dist/lib/node-esm/settings-BKKLNOFT.mjs.map +0 -7
  185. package/dist/lib/node-esm/state-LKANNCJJ.mjs +0 -27
  186. package/dist/lib/node-esm/state-LKANNCJJ.mjs.map +0 -7
  187. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  188. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  189. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -7
  190. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  191. package/dist/types/src/components/FeedbackForm.d.ts +0 -6
  192. package/dist/types/src/components/FeedbackForm.d.ts.map +0 -1
  193. package/dist/types/src/components/HelpContainer.d.ts +0 -3
  194. package/dist/types/src/components/HelpContainer.d.ts.map +0 -1
  195. package/dist/types/src/components/ObservabilitySettings.d.ts +0 -10
  196. package/dist/types/src/components/ObservabilitySettings.d.ts.map +0 -1
  197. package/dist/types/src/events.d.ts +0 -5
  198. package/dist/types/src/events.d.ts.map +0 -1
  199. package/dist/types/src/types/schema.d.ts +0 -313
  200. package/dist/types/src/types/schema.d.ts.map +0 -1
  201. package/src/capabilities/capabilities.ts +0 -22
  202. package/src/capabilities/intent-resolver.ts +0 -69
  203. package/src/components/FeedbackForm.tsx +0 -82
  204. package/src/components/HelpContainer.tsx +0 -41
  205. package/src/components/ObservabilitySettings.tsx +0 -48
  206. package/src/events.ts +0 -14
  207. package/src/types/schema.ts +0 -216
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/state.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { contributes } from '@dxos/app-framework';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { getObservabilityGroup } from '@dxos/observability';\n\nimport { OBSERVABILITY_PLUGIN } from '../meta';\n\nimport { ObservabilityCapabilities } from './capabilities';\n\nexport default async ({ namespace }: { namespace: string }) => {\n const state = new LocalStorageStore<ObservabilityCapabilities.State>(OBSERVABILITY_PLUGIN);\n\n state.prop({ key: 'notified', type: LocalStorageStore.bool({ allowUndefined: true }) });\n\n // NOTE: This is not stored in local storage such that it can be accessed by workers.\n state.values.group = await getObservabilityGroup(namespace);\n\n return contributes(ObservabilityCapabilities.State, state.values, () => state.close());\n};\n"],
5
- "mappings": ";;;;;;;;;AAIA,SAASA,mBAAmB;AAC5B,SAASC,yBAAyB;AAClC,SAASC,6BAA6B;AAMtC,IAAA,gBAAe,OAAO,EAAEC,UAAS,MAAyB;AACxD,QAAMC,QAAQ,IAAIC,kBAAmDC,oBAAAA;AAErEF,QAAMG,KAAK;IAAEC,KAAK;IAAYC,MAAMJ,kBAAkBK,KAAK;MAAEC,gBAAgB;IAAK,CAAA;EAAG,CAAA;AAGrFP,QAAMQ,OAAOC,QAAQ,MAAMC,sBAAsBX,SAAAA;AAEjD,SAAOY,YAAYC,0BAA0BC,OAAOb,MAAMQ,QAAQ,MAAMR,MAAMc,MAAK,CAAA;AACrF;",
6
- "names": ["contributes", "LocalStorageStore", "getObservabilityGroup", "namespace", "state", "LocalStorageStore", "OBSERVABILITY_PLUGIN", "prop", "key", "type", "bool", "allowUndefined", "values", "group", "getObservabilityGroup", "contributes", "ObservabilityCapabilities", "State", "close"]
7
- }
@@ -1,12 +0,0 @@
1
- import { type Client } from '@dxos/client';
2
- import { type Observability } from '@dxos/observability';
3
- export declare namespace ObservabilityCapabilities {
4
- type State = {
5
- group?: string;
6
- notified?: boolean;
7
- };
8
- const State: import("@dxos/app-framework").InterfaceDef<State>;
9
- const Observability: import("@dxos/app-framework").InterfaceDef<Observability>;
10
- }
11
- export declare const ClientCapability: import("@dxos/app-framework").InterfaceDef<Client>;
12
- //# sourceMappingURL=capabilities.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/capabilities.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,yBAAiB,yBAAyB,CAAC;IACzC,KAAY,KAAK,GAAG;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IACK,MAAM,KAAK,mDAAsE,CAAC;IAElF,MAAM,aAAa,2DAAsF,CAAC;CAClH;AAGD,eAAO,MAAM,gBAAgB,oDAAuE,CAAC"}
@@ -1,7 +0,0 @@
1
- import { Capabilities, type PluginContext } from '@dxos/app-framework';
2
- declare const _default: ({ context, namespace }: {
3
- context: PluginContext;
4
- namespace: string;
5
- }) => import("@dxos/app-framework").Capability<Capabilities.IntentResolver>;
6
- export default _default;
7
- //# sourceMappingURL=intent-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intent-resolver.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/intent-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAgB,KAAK,aAAa,EAA+B,MAAM,qBAAqB,CAAC;yBAUlG,wBAAwB;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAArF,wBAsDK"}
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- import { UserFeedback } from '../types';
3
- export declare const FeedbackForm: ({ onSave }: {
4
- onSave: (values: UserFeedback) => void;
5
- }) => React.JSX.Element;
6
- //# sourceMappingURL=FeedbackForm.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FeedbackForm.d.ts","sourceRoot":"","sources":["../../../../src/components/FeedbackForm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAO7D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA+CxC,eAAO,MAAM,YAAY,GAAI,YAAY;IAAE,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;CAAE,sBAuBlF,CAAC"}
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- export declare const HelpContainer: () => React.JSX.Element;
3
- //# sourceMappingURL=HelpContainer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HelpContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/HelpContainer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAS3C,eAAO,MAAM,aAAa,yBA0BzB,CAAC"}
@@ -1,10 +0,0 @@
1
- import { Schema } from 'effect';
2
- import React from 'react';
3
- export declare const ObservabilitySettingsSchema: Schema.mutable<Schema.Struct<{
4
- enabled: typeof Schema.Boolean;
5
- }>>;
6
- export type ObservabilitySettingsProps = Schema.Schema.Type<typeof ObservabilitySettingsSchema>;
7
- export declare const ObservabilitySettings: ({ settings }: {
8
- settings: ObservabilitySettingsProps;
9
- }) => React.JSX.Element;
10
- //# sourceMappingURL=ObservabilitySettings.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ObservabilitySettings.d.ts","sourceRoot":"","sources":["../../../../src/components/ObservabilitySettings.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,eAAO,MAAM,2BAA2B;;GAQvC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhG,eAAO,MAAM,qBAAqB,GAAI,cAAc;IAAE,QAAQ,EAAE,0BAA0B,CAAA;CAAE,sBAqB3F,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare namespace ObservabilityEvents {
2
- const StateReady: import("@dxos/app-framework").ActivationEvent;
3
- }
4
- export declare const ClientReadyEvent: import("@dxos/app-framework").ActivationEvent;
5
- //# sourceMappingURL=events.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/events.ts"],"names":[],"mappings":"AAQA,yBAAiB,mBAAmB,CAAC;IAC5B,MAAM,UAAU,+CAAgD,CAAC;CACzE;AAGD,eAAO,MAAM,gBAAgB,+CAA2D,CAAC"}
@@ -1,313 +0,0 @@
1
- import { Schema } from 'effect';
2
- import { Type } from '@dxos/echo';
3
- export declare const UserFeedback: Schema.Struct<{
4
- message: Schema.filter<Schema.filter<typeof Schema.String>>;
5
- }>;
6
- export type UserFeedback = Schema.Schema.Type<typeof UserFeedback>;
7
- export declare namespace ObservabilityAction {
8
- const Toggle_base: Schema.TaggedClass<Toggle, `${string}/action/toggle`, {
9
- readonly _tag: Schema.tag<`${string}/action/toggle`>;
10
- } & {
11
- input: Schema.Struct<{
12
- state: Schema.optional<typeof Schema.Boolean>;
13
- }>;
14
- output: typeof Schema.Boolean;
15
- }>;
16
- export class Toggle extends Toggle_base {
17
- }
18
- const CaptureUserFeedback_base: Schema.TaggedClass<CaptureUserFeedback, `${string}/action/capture-feedback`, {
19
- readonly _tag: Schema.tag<`${string}/action/capture-feedback`>;
20
- } & {
21
- input: Schema.Struct<{
22
- message: Schema.filter<Schema.filter<typeof Schema.String>>;
23
- }>;
24
- output: typeof Schema.Void;
25
- }>;
26
- export class CaptureUserFeedback extends CaptureUserFeedback_base {
27
- }
28
- const BaseSendEvent_base: Schema.TaggedClass<BaseSendEvent, `${string}/action/send-event`, {
29
- readonly _tag: Schema.tag<`${string}/action/send-event`>;
30
- } & {
31
- input: Schema.Struct<{
32
- name: typeof Schema.String;
33
- properties: Schema.optional<typeof Schema.Object>;
34
- }>;
35
- output: typeof Schema.Void;
36
- }>;
37
- /** Base intent for sending events. */
38
- export class BaseSendEvent extends BaseSendEvent_base {
39
- }
40
- const SendEvent_base: Schema.TaggedClass<SendEvent, `${string}/action/send-event`, {
41
- readonly _tag: Schema.tag<`${string}/action/send-event`>;
42
- } & {
43
- input: Schema.Union<[Schema.Struct<{
44
- name: Schema.Literal<["identity.create"]>;
45
- }>, Schema.Struct<{
46
- name: Schema.Literal<["identity.join"]>;
47
- }>, Schema.Struct<{
48
- name: Schema.Literal<["identity.recover"]>;
49
- }>, Schema.Struct<{
50
- name: Schema.Literal<["identity.share"]>;
51
- }>, Schema.Struct<{
52
- name: Schema.Literal<["navigation.activate"]>;
53
- properties: Schema.Struct<{
54
- subjectId: typeof Schema.String;
55
- typename: Schema.optional<typeof Schema.String>;
56
- }>;
57
- }>, Schema.Struct<{
58
- name: Schema.Literal<["page.load"]>;
59
- properties: Schema.Struct<{
60
- loadDuration: typeof Schema.Number;
61
- }>;
62
- }>, Schema.Struct<{
63
- name: Schema.Literal<["plugins.toggle"]>;
64
- properties: Schema.Struct<{
65
- plugin: typeof Schema.String;
66
- enabled: typeof Schema.Boolean;
67
- }>;
68
- }>, Schema.Struct<{
69
- name: Schema.Literal<["space.create"]>;
70
- properties: Schema.Struct<{
71
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
72
- byteLength: number;
73
- encode: (value: Uint8Array) => Type.SpaceId;
74
- decode: (value: Type.SpaceId) => Uint8Array;
75
- isValid: (value: string) => value is Type.SpaceId;
76
- make: (value: string) => Type.SpaceId;
77
- random: () => Type.SpaceId;
78
- };
79
- }>;
80
- }>, Schema.Struct<{
81
- name: Schema.Literal<["space.join"]>;
82
- properties: Schema.Struct<{
83
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
84
- byteLength: number;
85
- encode: (value: Uint8Array) => Type.SpaceId;
86
- decode: (value: Type.SpaceId) => Uint8Array;
87
- isValid: (value: string) => value is Type.SpaceId;
88
- make: (value: string) => Type.SpaceId;
89
- random: () => Type.SpaceId;
90
- };
91
- }>;
92
- }>, Schema.Struct<{
93
- name: Schema.Literal<["space.limit"]>;
94
- properties: Schema.Struct<{
95
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
96
- byteLength: number;
97
- encode: (value: Uint8Array) => Type.SpaceId;
98
- decode: (value: Type.SpaceId) => Uint8Array;
99
- isValid: (value: string) => value is Type.SpaceId;
100
- make: (value: string) => Type.SpaceId;
101
- random: () => Type.SpaceId;
102
- };
103
- }>;
104
- }>, Schema.Struct<{
105
- name: Schema.Literal<["space.lock"]>;
106
- properties: Schema.Struct<{
107
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
108
- byteLength: number;
109
- encode: (value: Uint8Array) => Type.SpaceId;
110
- decode: (value: Type.SpaceId) => Uint8Array;
111
- isValid: (value: string) => value is Type.SpaceId;
112
- make: (value: string) => Type.SpaceId;
113
- random: () => Type.SpaceId;
114
- };
115
- }>;
116
- }>, Schema.Struct<{
117
- name: Schema.Literal<["space.migrate"]>;
118
- properties: Schema.Struct<{
119
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
120
- byteLength: number;
121
- encode: (value: Uint8Array) => Type.SpaceId;
122
- decode: (value: Type.SpaceId) => Uint8Array;
123
- isValid: (value: string) => value is Type.SpaceId;
124
- make: (value: string) => Type.SpaceId;
125
- random: () => Type.SpaceId;
126
- };
127
- targetVersion: Schema.optional<typeof Schema.String>;
128
- version: Schema.optional<typeof Schema.String>;
129
- }>;
130
- }>, Schema.Struct<{
131
- name: Schema.Literal<["space.schema.use"]>;
132
- properties: Schema.Struct<{
133
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
134
- byteLength: number;
135
- encode: (value: Uint8Array) => Type.SpaceId;
136
- decode: (value: Type.SpaceId) => Uint8Array;
137
- isValid: (value: string) => value is Type.SpaceId;
138
- make: (value: string) => Type.SpaceId;
139
- random: () => Type.SpaceId;
140
- };
141
- typename: typeof Schema.String;
142
- }>;
143
- }>, Schema.Struct<{
144
- name: Schema.Literal<["space.schema.add"]>;
145
- properties: Schema.Struct<{
146
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
147
- byteLength: number;
148
- encode: (value: Uint8Array) => Type.SpaceId;
149
- decode: (value: Type.SpaceId) => Uint8Array;
150
- isValid: (value: string) => value is Type.SpaceId;
151
- make: (value: string) => Type.SpaceId;
152
- random: () => Type.SpaceId;
153
- };
154
- objectId: typeof Schema.String;
155
- typename: typeof Schema.String;
156
- }>;
157
- }>, Schema.Struct<{
158
- name: Schema.Literal<["space.object.add"]>;
159
- properties: Schema.Struct<{
160
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
161
- byteLength: number;
162
- encode: (value: Uint8Array) => Type.SpaceId;
163
- decode: (value: Type.SpaceId) => Uint8Array;
164
- isValid: (value: string) => value is Type.SpaceId;
165
- make: (value: string) => Type.SpaceId;
166
- random: () => Type.SpaceId;
167
- };
168
- objectId: typeof Schema.String;
169
- typename: Schema.optional<typeof Schema.String>;
170
- }>;
171
- }>, Schema.Struct<{
172
- name: Schema.Literal<["space.share"]>;
173
- properties: Schema.Struct<{
174
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
175
- byteLength: number;
176
- encode: (value: Uint8Array) => Type.SpaceId;
177
- decode: (value: Type.SpaceId) => Uint8Array;
178
- isValid: (value: string) => value is Type.SpaceId;
179
- make: (value: string) => Type.SpaceId;
180
- random: () => Type.SpaceId;
181
- };
182
- }>;
183
- }>, Schema.Struct<{
184
- name: Schema.Literal<["space.unlock"]>;
185
- properties: Schema.Struct<{
186
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
187
- byteLength: number;
188
- encode: (value: Uint8Array) => Type.SpaceId;
189
- decode: (value: Type.SpaceId) => Uint8Array;
190
- isValid: (value: string) => value is Type.SpaceId;
191
- make: (value: string) => Type.SpaceId;
192
- random: () => Type.SpaceId;
193
- };
194
- }>;
195
- }>, Schema.Struct<{
196
- name: Schema.Literal<["threads.create"]>;
197
- properties: Schema.Struct<{
198
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
199
- byteLength: number;
200
- encode: (value: Uint8Array) => Type.SpaceId;
201
- decode: (value: Type.SpaceId) => Uint8Array;
202
- isValid: (value: string) => value is Type.SpaceId;
203
- make: (value: string) => Type.SpaceId;
204
- random: () => Type.SpaceId;
205
- };
206
- threadId: typeof Schema.String;
207
- }>;
208
- }>, Schema.Struct<{
209
- name: Schema.Literal<["threads.delete"]>;
210
- properties: Schema.Struct<{
211
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
212
- byteLength: number;
213
- encode: (value: Uint8Array) => Type.SpaceId;
214
- decode: (value: Type.SpaceId) => Uint8Array;
215
- isValid: (value: string) => value is Type.SpaceId;
216
- make: (value: string) => Type.SpaceId;
217
- random: () => Type.SpaceId;
218
- };
219
- threadId: typeof Schema.String;
220
- }>;
221
- }>, Schema.Struct<{
222
- name: Schema.Literal<["threads.message.add"]>;
223
- properties: Schema.Struct<{
224
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
225
- byteLength: number;
226
- encode: (value: Uint8Array) => Type.SpaceId;
227
- decode: (value: Type.SpaceId) => Uint8Array;
228
- isValid: (value: string) => value is Type.SpaceId;
229
- make: (value: string) => Type.SpaceId;
230
- random: () => Type.SpaceId;
231
- };
232
- threadId: typeof Schema.String;
233
- threadLength: typeof Schema.Number;
234
- messageId: typeof Schema.String;
235
- messageLength: typeof Schema.Number;
236
- }>;
237
- }>, Schema.Struct<{
238
- name: Schema.Literal<["threads.message.delete"]>;
239
- properties: Schema.Struct<{
240
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
241
- byteLength: number;
242
- encode: (value: Uint8Array) => Type.SpaceId;
243
- decode: (value: Type.SpaceId) => Uint8Array;
244
- isValid: (value: string) => value is Type.SpaceId;
245
- make: (value: string) => Type.SpaceId;
246
- random: () => Type.SpaceId;
247
- };
248
- threadId: typeof Schema.String;
249
- messageId: typeof Schema.String;
250
- }>;
251
- }>, Schema.Struct<{
252
- name: Schema.Literal<["threads.message.undo-delete"]>;
253
- properties: Schema.Struct<{
254
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
255
- byteLength: number;
256
- encode: (value: Uint8Array) => Type.SpaceId;
257
- decode: (value: Type.SpaceId) => Uint8Array;
258
- isValid: (value: string) => value is Type.SpaceId;
259
- make: (value: string) => Type.SpaceId;
260
- random: () => Type.SpaceId;
261
- };
262
- threadId: typeof Schema.String;
263
- messageId: typeof Schema.String;
264
- }>;
265
- }>, Schema.Struct<{
266
- name: Schema.Literal<["threads.message.update"]>;
267
- properties: Schema.Struct<{
268
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
269
- byteLength: number;
270
- encode: (value: Uint8Array) => Type.SpaceId;
271
- decode: (value: Type.SpaceId) => Uint8Array;
272
- isValid: (value: string) => value is Type.SpaceId;
273
- make: (value: string) => Type.SpaceId;
274
- random: () => Type.SpaceId;
275
- };
276
- messageId: typeof Schema.String;
277
- messageLength: typeof Schema.Number;
278
- }>;
279
- }>, Schema.Struct<{
280
- name: Schema.Literal<["threads.toggle-resolved"]>;
281
- properties: Schema.Struct<{
282
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
283
- byteLength: number;
284
- encode: (value: Uint8Array) => Type.SpaceId;
285
- decode: (value: Type.SpaceId) => Uint8Array;
286
- isValid: (value: string) => value is Type.SpaceId;
287
- make: (value: string) => Type.SpaceId;
288
- random: () => Type.SpaceId;
289
- };
290
- threadId: typeof Schema.String;
291
- }>;
292
- }>, Schema.Struct<{
293
- name: Schema.Literal<["threads.undo-delete"]>;
294
- properties: Schema.Struct<{
295
- spaceId: Schema.Schema<Type.SpaceId, string, never> & {
296
- byteLength: number;
297
- encode: (value: Uint8Array) => Type.SpaceId;
298
- decode: (value: Type.SpaceId) => Uint8Array;
299
- isValid: (value: string) => value is Type.SpaceId;
300
- make: (value: string) => Type.SpaceId;
301
- random: () => Type.SpaceId;
302
- };
303
- threadId: typeof Schema.String;
304
- }>;
305
- }>]>;
306
- output: typeof Schema.Void;
307
- }>;
308
- /** Intent with strict types for first-party events. */
309
- export class SendEvent extends SendEvent_base {
310
- }
311
- export {};
312
- }
313
- //# sourceMappingURL=schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/types/schema.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUlC,eAAO,MAAM,YAAY;;EAEvB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC;AAEnE,yBAAiB,mBAAmB,CAAC;;;;;;;;;IACnC,MAAM,OAAO,MAAO,SAAQ,WAK1B;KAAG;;;;;;;;;IAEL,MAAM,OAAO,mBAAoB,SAAQ,wBAMxC;KAAG;;;;;;;;;;IAEJ,sCAAsC;IACtC,MAAM,OAAO,aAAc,SAAQ,kBAMjC;KAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEL,uDAAuD;IACvD,MAAM,OAAO,SAAU,SAAQ,cAsK7B;KAAG;;CACN"}
@@ -1,22 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { defineCapability } from '@dxos/app-framework';
6
- import { type Client } from '@dxos/client';
7
- import { type Observability } from '@dxos/observability';
8
-
9
- import { OBSERVABILITY_PLUGIN } from '../meta';
10
-
11
- export namespace ObservabilityCapabilities {
12
- export type State = {
13
- group?: string;
14
- notified?: boolean;
15
- };
16
- export const State = defineCapability<State>(`${OBSERVABILITY_PLUGIN}/capability/state`);
17
-
18
- export const Observability = defineCapability<Observability>(`${OBSERVABILITY_PLUGIN}/capability/observability`);
19
- }
20
-
21
- // NOTE: This is cloned from the client plugin to avoid circular dependencies.
22
- export const ClientCapability = defineCapability<Client>('dxos.org/plugin/client/capability/client');
@@ -1,69 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capabilities, IntentAction, type PluginContext, contributes, createResolver } from '@dxos/app-framework';
6
- import { log } from '@dxos/log';
7
- import { getTelemetryIdentity, storeObservabilityDisabled } from '@dxos/observability';
8
-
9
- import { type ObservabilitySettingsProps } from '../components';
10
- import { OBSERVABILITY_PLUGIN } from '../meta';
11
- import { ObservabilityAction } from '../types';
12
-
13
- import { ClientCapability, ObservabilityCapabilities } from './capabilities';
14
-
15
- export default ({ context, namespace }: { context: PluginContext; namespace: string }) =>
16
- contributes(Capabilities.IntentResolver, [
17
- createResolver({
18
- intent: IntentAction.Track,
19
- resolve: (intent) => {
20
- log.info('intent', { intent });
21
- },
22
- }),
23
- createResolver({
24
- intent: ObservabilityAction.Toggle,
25
- resolve: async ({ state }) => {
26
- const client = context.getCapability(ClientCapability);
27
- const observability = context.getCapability(ObservabilityCapabilities.Observability);
28
- const settings = context
29
- .getCapability(Capabilities.SettingsStore)
30
- .getStore<ObservabilitySettingsProps>(OBSERVABILITY_PLUGIN)!.value;
31
- settings.enabled = state ?? !settings.enabled;
32
- observability.track({
33
- ...getTelemetryIdentity(client),
34
- action: 'observability.toggle',
35
- properties: {
36
- enabled: settings.enabled,
37
- },
38
- });
39
- observability.setMode(settings.enabled ? 'basic' : 'disabled');
40
- await storeObservabilityDisabled(namespace, !settings.enabled);
41
- return { data: settings.enabled };
42
- },
43
- }),
44
- createResolver({
45
- intent: ObservabilityAction.SendEvent,
46
- resolve: (data) => {
47
- const client = context.getCapability(ClientCapability);
48
- const properties = 'properties' in data ? data.properties : {};
49
-
50
- // NOTE: This is to ensure that events fired before observability is ready are still sent.
51
- // TODO(wittjosiah): If the intent dispatcher supports concurrent actions in the future,
52
- // then this could be awaited still rather than voiding.
53
- void context.waitForCapability(ObservabilityCapabilities.Observability).then((observability) => {
54
- observability.track({
55
- ...getTelemetryIdentity(client),
56
- action: data.name,
57
- properties,
58
- });
59
- });
60
- },
61
- }),
62
- createResolver({
63
- intent: ObservabilityAction.CaptureUserFeedback,
64
- resolve: async (data) => {
65
- const observability = context.getCapability(ObservabilityCapabilities.Observability);
66
- observability.captureUserFeedback(data.message);
67
- },
68
- }),
69
- ]);
@@ -1,82 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import React, { useCallback, useRef, useState } from 'react';
6
-
7
- import { getSnapshot } from '@dxos/echo-schema';
8
- import { IconButton, Input, useTranslation } from '@dxos/react-ui';
9
- import { FormProvider, useFormContext, useInputProps } from '@dxos/react-ui-form';
10
-
11
- import { OBSERVABILITY_PLUGIN } from '../meta';
12
- import { UserFeedback } from '../types';
13
-
14
- const defaultValues: UserFeedback = { message: '' };
15
-
16
- const FormContent = () => {
17
- const { t } = useTranslation(OBSERVABILITY_PLUGIN);
18
- const { handleSave, canSave } = useFormContext<UserFeedback>();
19
-
20
- const messageProps = useInputProps(['message']);
21
-
22
- return (
23
- <div role='form' className='p-3 flex flex-col gap-2'>
24
- <div role='none' className='space-b-1'>
25
- <Input.Root validationValence={messageProps.getStatus().status}>
26
- <Input.Label>{t('feedback text area label')}</Input.Label>
27
- <Input.TextArea
28
- classNames={'text-sm'}
29
- rows={5}
30
- cols={30}
31
- placeholder={t('feedback text area placeholder')}
32
- value={messageProps.getValue() ?? ''}
33
- onChange={(e) => messageProps.onValueChange('string', e.target.value)}
34
- // TODO(wittjosiah): This aggressively shows validation errors.
35
- onBlur={messageProps.onBlur}
36
- />
37
- <Input.DescriptionAndValidation>
38
- <Input.Validation>{messageProps.getStatus().error}</Input.Validation>
39
- </Input.DescriptionAndValidation>
40
- </Input.Root>
41
- </div>
42
-
43
- <div role='none' className='space-b-2'>
44
- <IconButton
45
- icon='ph--paper-plane-tilt--regular'
46
- label={t('send feedback label')}
47
- variant='primary'
48
- type='submit'
49
- classNames='is-full'
50
- disabled={!canSave}
51
- onClick={handleSave}
52
- />
53
- </div>
54
- </div>
55
- );
56
- };
57
-
58
- // TODO(wittjosiah): Use `Form`?
59
- export const FeedbackForm = ({ onSave }: { onSave: (values: UserFeedback) => void }) => {
60
- const formRef = useRef<HTMLDivElement>(null);
61
- const [_, update] = useState({});
62
- const forceRender = useCallback(() => update({}), [update]);
63
-
64
- const handleSave = useCallback(
65
- (values: UserFeedback) => {
66
- onSave(values);
67
- // TODO(wittjosiah): Force re-render to clear the form.
68
- forceRender();
69
- },
70
- [forceRender, onSave],
71
- );
72
-
73
- const initialValues = getSnapshot(defaultValues);
74
-
75
- return (
76
- <FormProvider formRef={formRef} schema={UserFeedback} initialValues={initialValues} onSave={handleSave}>
77
- <div ref={formRef}>
78
- <FormContent />
79
- </div>
80
- </FormProvider>
81
- );
82
- };
@@ -1,41 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { pipe } from 'effect';
6
- import React, { useCallback } from 'react';
7
-
8
- import { LayoutAction, chain, createIntent, useIntentDispatcher } from '@dxos/app-framework';
9
-
10
- import { OBSERVABILITY_PLUGIN } from '../meta';
11
- import { ObservabilityAction, type UserFeedback } from '../types';
12
-
13
- import { FeedbackForm } from './FeedbackForm';
14
-
15
- export const HelpContainer = () => {
16
- const { dispatchPromise: dispatch } = useIntentDispatcher();
17
-
18
- const handleSave = useCallback(
19
- (values: UserFeedback) =>
20
- dispatch(
21
- pipe(
22
- createIntent(ObservabilityAction.CaptureUserFeedback, values),
23
- chain(LayoutAction.UpdateComplementary, { part: 'complementary', options: { state: 'collapsed' } }),
24
- chain(LayoutAction.AddToast, {
25
- part: 'toast',
26
- subject: {
27
- id: `${OBSERVABILITY_PLUGIN}/feedback-success`,
28
- icon: 'ph--paper-plane-tilt--regular',
29
- duration: 3000,
30
- title: ['feedback toast label', { ns: OBSERVABILITY_PLUGIN }],
31
- description: ['feedback toast description', { ns: OBSERVABILITY_PLUGIN }],
32
- closeLabel: ['close label', { ns: 'os' }],
33
- },
34
- }),
35
- ),
36
- ),
37
- [dispatch],
38
- );
39
-
40
- return <FeedbackForm onSave={handleSave} />;
41
- };