@dxos/plugin-script 0.8.0 → 0.8.1-main.81238a8

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 (184) hide show
  1. package/dist/lib/browser/{ScriptContainer-3RFMYKTV.mjs → ScriptContainer-7PTOJ4KY.mjs} +18 -21
  2. package/dist/lib/browser/ScriptContainer-7PTOJ4KY.mjs.map +7 -0
  3. package/dist/lib/browser/{artifact-definition-4LWPD3DH.mjs → artifact-definition-GYCZJGR4.mjs} +8 -7
  4. package/dist/lib/browser/artifact-definition-GYCZJGR4.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-FVVCAWNP.mjs → chunk-27LV6ARH.mjs} +1 -1
  6. package/dist/lib/browser/chunk-27LV6ARH.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-PZPYF7M4.mjs → chunk-4SSKJNMZ.mjs} +2 -2
  8. package/dist/lib/browser/chunk-4SSKJNMZ.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-N46LE7FS.mjs → chunk-AJNRPWAA.mjs} +4 -4
  10. package/dist/lib/browser/{chunk-N46LE7FS.mjs.map → chunk-AJNRPWAA.mjs.map} +1 -1
  11. package/dist/lib/browser/{chunk-G2FYNDU4.mjs → chunk-DZB4KWOI.mjs} +96 -49
  12. package/dist/lib/browser/chunk-DZB4KWOI.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-6MOQ4BP3.mjs → chunk-FG66JYON.mjs} +2 -2
  14. package/dist/lib/browser/chunk-QHE53FDV.mjs +467 -0
  15. package/dist/lib/browser/chunk-QHE53FDV.mjs.map +7 -0
  16. package/dist/lib/browser/{compiler-YY2XSKHQ.mjs → compiler-ZQLHHJ5P.mjs} +3 -3
  17. package/dist/lib/browser/index.mjs +21 -18
  18. package/dist/lib/browser/index.mjs.map +3 -3
  19. package/dist/lib/browser/{intent-resolver-D6FPY5ZA.mjs → intent-resolver-3B3Z67FP.mjs} +5 -5
  20. package/dist/lib/browser/{intent-resolver-D6FPY5ZA.mjs.map → intent-resolver-3B3Z67FP.mjs.map} +1 -1
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/{react-surface-G4C2PZ2K.mjs → react-surface-GQD6LJDJ.mjs} +14 -16
  23. package/dist/lib/browser/react-surface-GQD6LJDJ.mjs.map +7 -0
  24. package/dist/lib/browser/{settings-SZCDKHWO.mjs → settings-467GVEBU.mjs} +3 -3
  25. package/dist/lib/browser/types.mjs +2 -2
  26. package/dist/lib/node/{ScriptContainer-G6FZU4AM.cjs → ScriptContainer-VHHYWC3A.cjs} +26 -28
  27. package/dist/lib/node/ScriptContainer-VHHYWC3A.cjs.map +7 -0
  28. package/dist/lib/node/{artifact-definition-BXQCFPAH.cjs → artifact-definition-3SNVJ34V.cjs} +20 -19
  29. package/dist/lib/node/artifact-definition-3SNVJ34V.cjs.map +7 -0
  30. package/dist/lib/node/{chunk-5UH3F7TA.cjs → chunk-2XX4L67K.cjs} +4 -4
  31. package/dist/lib/node/chunk-2XX4L67K.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-ALY3N6PW.cjs → chunk-AOKGOI5J.cjs} +6 -6
  33. package/dist/lib/node/{chunk-XKYJYY3T.cjs → chunk-MSH4SVCN.cjs} +107 -61
  34. package/dist/lib/node/chunk-MSH4SVCN.cjs.map +7 -0
  35. package/dist/lib/node/chunk-W4U3OWKO.cjs +493 -0
  36. package/dist/lib/node/chunk-W4U3OWKO.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-ITAJ3WRW.cjs → chunk-XCQNFRZ6.cjs} +5 -5
  38. package/dist/lib/node/chunk-XCQNFRZ6.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-DJGLGRQV.cjs → chunk-XFB6JL2G.cjs} +10 -10
  40. package/dist/lib/node/chunk-XFB6JL2G.cjs.map +7 -0
  41. package/dist/lib/node/{compiler-UIBLKJKG.cjs → compiler-5ALLTH2B.cjs} +7 -7
  42. package/dist/lib/node/index.cjs +48 -45
  43. package/dist/lib/node/index.cjs.map +3 -3
  44. package/dist/lib/node/{intent-resolver-NYJFPD5B.cjs → intent-resolver-CN5WMMAD.cjs} +11 -11
  45. package/dist/lib/node/intent-resolver-CN5WMMAD.cjs.map +7 -0
  46. package/dist/lib/node/meta.json +1 -1
  47. package/dist/lib/node/{react-surface-EGSE3FMN.cjs → react-surface-VV7J7PQN.cjs} +28 -29
  48. package/dist/lib/node/react-surface-VV7J7PQN.cjs.map +7 -0
  49. package/dist/lib/node/{settings-SZFSMSKM.cjs → settings-WLYT2XQF.cjs} +9 -9
  50. package/dist/lib/node/types.cjs +4 -4
  51. package/dist/lib/node/types.cjs.map +1 -1
  52. package/dist/lib/node-esm/{ScriptContainer-7FTCFIF3.mjs → ScriptContainer-A4J44DZD.mjs} +18 -21
  53. package/dist/lib/node-esm/ScriptContainer-A4J44DZD.mjs.map +7 -0
  54. package/dist/lib/node-esm/{artifact-definition-KT4DK2LQ.mjs → artifact-definition-VAFNV62U.mjs} +8 -7
  55. package/dist/lib/node-esm/artifact-definition-VAFNV62U.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-2RKD5MCW.mjs +468 -0
  57. package/dist/lib/node-esm/chunk-2RKD5MCW.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-YIWRJ25J.mjs → chunk-4YUSGXJ2.mjs} +2 -2
  59. package/dist/lib/node-esm/chunk-4YUSGXJ2.mjs.map +7 -0
  60. package/dist/lib/node-esm/{chunk-P2V2Y5LV.mjs → chunk-5S2KBIMH.mjs} +1 -1
  61. package/dist/lib/node-esm/chunk-5S2KBIMH.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-CP5LXTK5.mjs → chunk-MFXRE7ZD.mjs} +2 -2
  63. package/dist/lib/node-esm/{chunk-NRICF4KE.mjs → chunk-QHZ6KA5J.mjs} +96 -49
  64. package/dist/lib/node-esm/chunk-QHZ6KA5J.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-UNQFIERE.mjs → chunk-WQ4YIZ2L.mjs} +4 -4
  66. package/dist/lib/node-esm/{chunk-UNQFIERE.mjs.map → chunk-WQ4YIZ2L.mjs.map} +1 -1
  67. package/dist/lib/node-esm/{compiler-XTXFGZJM.mjs → compiler-K7GYROAO.mjs} +3 -3
  68. package/dist/lib/node-esm/index.mjs +21 -18
  69. package/dist/lib/node-esm/index.mjs.map +3 -3
  70. package/dist/lib/node-esm/{intent-resolver-KLBHSMW4.mjs → intent-resolver-6F7CVQEX.mjs} +5 -5
  71. package/dist/lib/node-esm/{intent-resolver-KLBHSMW4.mjs.map → intent-resolver-6F7CVQEX.mjs.map} +1 -1
  72. package/dist/lib/node-esm/meta.json +1 -1
  73. package/dist/lib/node-esm/{react-surface-7YSGHZQM.mjs → react-surface-RPNDRJVD.mjs} +14 -16
  74. package/dist/lib/node-esm/react-surface-RPNDRJVD.mjs.map +7 -0
  75. package/dist/lib/node-esm/{settings-GR4O2WHZ.mjs → settings-DR3B6GHE.mjs} +3 -3
  76. package/dist/lib/node-esm/types.mjs +2 -2
  77. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  80. package/dist/types/src/components/DebugPanel/DebugPanel.d.ts +2 -1
  81. package/dist/types/src/components/DebugPanel/DebugPanel.d.ts.map +1 -1
  82. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts +2 -1
  83. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -1
  84. package/dist/types/src/components/LogsPanel/LogsPanel.d.ts +8 -0
  85. package/dist/types/src/components/LogsPanel/LogsPanel.d.ts.map +1 -0
  86. package/dist/types/src/components/LogsPanel/index.d.ts +2 -0
  87. package/dist/types/src/components/LogsPanel/index.d.ts.map +1 -0
  88. package/dist/types/src/components/ScriptContainer.d.ts +4 -2
  89. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  90. package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts +2 -1
  91. package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts.map +1 -1
  92. package/dist/types/src/components/ScriptSettingsPanel.d.ts +3 -2
  93. package/dist/types/src/components/ScriptSettingsPanel.d.ts.map +1 -1
  94. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts +3 -2
  95. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
  96. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +2 -1
  97. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  98. package/dist/types/src/components/index.d.ts +2 -1
  99. package/dist/types/src/components/index.d.ts.map +1 -1
  100. package/dist/types/src/hooks/deploy.d.ts +24 -0
  101. package/dist/types/src/hooks/deploy.d.ts.map +1 -1
  102. package/dist/types/src/hooks/format.d.ts +1 -1
  103. package/dist/types/src/hooks/format.d.ts.map +1 -1
  104. package/dist/types/src/hooks/template.d.ts +1 -1
  105. package/dist/types/src/hooks/template.d.ts.map +1 -1
  106. package/dist/types/src/hooks/useToolbarAction.d.ts +1 -1
  107. package/dist/types/src/hooks/useToolbarAction.d.ts.map +1 -1
  108. package/dist/types/src/hooks/useToolbarState.d.ts +2 -8
  109. package/dist/types/src/hooks/useToolbarState.d.ts.map +1 -1
  110. package/dist/types/src/hooks/view.d.ts +3 -15
  111. package/dist/types/src/hooks/view.d.ts.map +1 -1
  112. package/dist/types/src/meta.d.ts +2 -9
  113. package/dist/types/src/meta.d.ts.map +1 -1
  114. package/dist/types/src/templates/discord.d.ts.map +1 -1
  115. package/dist/types/src/templates/index.d.ts.map +1 -1
  116. package/dist/types/src/translations.d.ts +6 -3
  117. package/dist/types/src/translations.d.ts.map +1 -1
  118. package/dist/types/src/types.d.ts +8 -2
  119. package/dist/types/src/types.d.ts.map +1 -1
  120. package/package.json +47 -43
  121. package/src/ScriptPlugin.tsx +3 -2
  122. package/src/capabilities/artifact-definition.ts +2 -1
  123. package/src/capabilities/intent-resolver.ts +1 -1
  124. package/src/capabilities/react-surface.tsx +16 -6
  125. package/src/components/LogsPanel/LogsPanel.tsx +106 -0
  126. package/src/components/LogsPanel/index.ts +5 -0
  127. package/src/components/ScriptContainer.tsx +18 -12
  128. package/src/components/ScriptSettingsPanel.tsx +1 -1
  129. package/src/components/ScriptToolbar/ScriptToolbar.tsx +1 -1
  130. package/src/components/TypescriptEditor/TypescriptEditor.tsx +1 -0
  131. package/src/components/index.ts +1 -0
  132. package/src/hooks/deploy.ts +4 -5
  133. package/src/hooks/format.ts +1 -1
  134. package/src/hooks/template.ts +1 -1
  135. package/src/hooks/useToolbarAction.ts +13 -4
  136. package/src/hooks/useToolbarState.ts +2 -2
  137. package/src/hooks/view.ts +7 -24
  138. package/src/meta.ts +2 -2
  139. package/src/templates/discord.ts +12 -5
  140. package/src/templates/index.ts +0 -7
  141. package/src/translations.ts +3 -4
  142. package/src/types.ts +2 -2
  143. package/src/vite-env.d.ts +20 -0
  144. package/dist/lib/browser/ScriptContainer-3RFMYKTV.mjs.map +0 -7
  145. package/dist/lib/browser/artifact-definition-4LWPD3DH.mjs.map +0 -7
  146. package/dist/lib/browser/chunk-5SXOHNAK.mjs +0 -240
  147. package/dist/lib/browser/chunk-5SXOHNAK.mjs.map +0 -7
  148. package/dist/lib/browser/chunk-FVVCAWNP.mjs.map +0 -7
  149. package/dist/lib/browser/chunk-G2FYNDU4.mjs.map +0 -7
  150. package/dist/lib/browser/chunk-PZPYF7M4.mjs.map +0 -7
  151. package/dist/lib/browser/chunk-VTWBVFBK.mjs +0 -234
  152. package/dist/lib/browser/chunk-VTWBVFBK.mjs.map +0 -7
  153. package/dist/lib/browser/react-surface-G4C2PZ2K.mjs.map +0 -7
  154. package/dist/lib/node/ScriptContainer-G6FZU4AM.cjs.map +0 -7
  155. package/dist/lib/node/artifact-definition-BXQCFPAH.cjs.map +0 -7
  156. package/dist/lib/node/chunk-5UH3F7TA.cjs.map +0 -7
  157. package/dist/lib/node/chunk-DJGLGRQV.cjs.map +0 -7
  158. package/dist/lib/node/chunk-ITAJ3WRW.cjs.map +0 -7
  159. package/dist/lib/node/chunk-K3ZZWVXS.cjs +0 -269
  160. package/dist/lib/node/chunk-K3ZZWVXS.cjs.map +0 -7
  161. package/dist/lib/node/chunk-TOXBGIEI.cjs +0 -261
  162. package/dist/lib/node/chunk-TOXBGIEI.cjs.map +0 -7
  163. package/dist/lib/node/chunk-XKYJYY3T.cjs.map +0 -7
  164. package/dist/lib/node/intent-resolver-NYJFPD5B.cjs.map +0 -7
  165. package/dist/lib/node/react-surface-EGSE3FMN.cjs.map +0 -7
  166. package/dist/lib/node-esm/ScriptContainer-7FTCFIF3.mjs.map +0 -7
  167. package/dist/lib/node-esm/artifact-definition-KT4DK2LQ.mjs.map +0 -7
  168. package/dist/lib/node-esm/chunk-2AFXX34U.mjs +0 -241
  169. package/dist/lib/node-esm/chunk-2AFXX34U.mjs.map +0 -7
  170. package/dist/lib/node-esm/chunk-NRICF4KE.mjs.map +0 -7
  171. package/dist/lib/node-esm/chunk-P2V2Y5LV.mjs.map +0 -7
  172. package/dist/lib/node-esm/chunk-S64WSJQK.mjs +0 -235
  173. package/dist/lib/node-esm/chunk-S64WSJQK.mjs.map +0 -7
  174. package/dist/lib/node-esm/chunk-YIWRJ25J.mjs.map +0 -7
  175. package/dist/lib/node-esm/react-surface-7YSGHZQM.mjs.map +0 -7
  176. /package/dist/lib/browser/{chunk-6MOQ4BP3.mjs.map → chunk-FG66JYON.mjs.map} +0 -0
  177. /package/dist/lib/browser/{compiler-YY2XSKHQ.mjs.map → compiler-ZQLHHJ5P.mjs.map} +0 -0
  178. /package/dist/lib/browser/{settings-SZCDKHWO.mjs.map → settings-467GVEBU.mjs.map} +0 -0
  179. /package/dist/lib/node/{chunk-ALY3N6PW.cjs.map → chunk-AOKGOI5J.cjs.map} +0 -0
  180. /package/dist/lib/node/{compiler-UIBLKJKG.cjs.map → compiler-5ALLTH2B.cjs.map} +0 -0
  181. /package/dist/lib/node/{settings-SZFSMSKM.cjs.map → settings-WLYT2XQF.cjs.map} +0 -0
  182. /package/dist/lib/node-esm/{chunk-CP5LXTK5.mjs.map → chunk-MFXRE7ZD.mjs.map} +0 -0
  183. /package/dist/lib/node-esm/{compiler-XTXFGZJM.mjs.map → compiler-K7GYROAO.mjs.map} +0 -0
  184. /package/dist/lib/node-esm/{settings-GR4O2WHZ.mjs.map → settings-DR3B6GHE.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/deploy.ts", "../../../src/hooks/useToolbarState.ts", "../../../src/hooks/format.ts", "../../../src/hooks/template.ts", "../../../src/hooks/view.ts", "../../../src/hooks/useToolbarAction.ts", "../../../src/components/LogsPanel/LogsPanel.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport {\n FunctionType,\n type ScriptType,\n getInvocationUrl,\n getUserFunctionUrlInMetadata,\n incrementSemverPatch,\n setUserFunctionUrlInMetadata,\n uploadWorkerFunction,\n} from '@dxos/functions';\nimport { Bundler } from '@dxos/functions/bundler';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, create, getMeta, getSpace, makeRef, useQuery } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { createMenuAction } from '@dxos/react-ui-menu';\n\nimport { type ViewState } from './view';\nimport { SCRIPT_PLUGIN } from '../meta';\n\nexport type DeployActionProperties = { type: 'deploy' } | { type: 'copy' };\n\nexport type DeployState = ViewState & {\n deploying: boolean;\n deployed: boolean;\n functionUrl: string;\n error: string;\n};\n\nexport const createDeploy = (state: Partial<DeployState>) => {\n const errorItem = createMenuAction('error', {\n label: state.error ?? ['no error label', { ns: SCRIPT_PLUGIN }],\n icon: 'ph--warning-circle--regular',\n hidden: !state.error,\n });\n\n const deployAction = createMenuAction<DeployActionProperties>('deploy', {\n type: 'deploy',\n label: [state.deploying ? 'pending label' : 'deploy label', { ns: SCRIPT_PLUGIN }],\n icon: state.deploying ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular',\n disabled: state.deploying,\n classNames: state.deploying ? '[&_svg]:animate-spin' : '',\n });\n\n const copyAction = createMenuAction<DeployActionProperties>('copy', {\n type: 'copy',\n label: ['copy link label', { ns: SCRIPT_PLUGIN }],\n icon: 'ph--link--regular',\n disabled: !state.functionUrl,\n });\n\n return {\n nodes: [errorItem, deployAction, copyAction],\n edges: [\n { source: 'root', target: 'error' },\n { source: 'root', target: 'deploy' },\n { source: 'root', target: 'copy' },\n ],\n };\n};\n\nexport const useDeployDeps = ({ script }: { script: ScriptType }) => {\n const space = getSpace(script);\n const [fn] = useQuery(space, Filter.schema(FunctionType, { source: script }));\n const client = useClient();\n const existingFunctionUrl = useMemo(() => fn && getUserFunctionUrlInMetadata(getMeta(fn)), [fn]);\n return { space, fn, client, existingFunctionUrl };\n};\n\nexport const useDeployState = ({ state, script }: { state: Partial<DeployState>; script: ScriptType }) => {\n const { space, client, existingFunctionUrl } = useDeployDeps({ script });\n useEffect(() => {\n if (!existingFunctionUrl) {\n return;\n }\n\n state.functionUrl = getInvocationUrl(existingFunctionUrl, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: space?.id,\n });\n }, [existingFunctionUrl, space]);\n\n useEffect(() => {\n state.deployed = Boolean(existingFunctionUrl) && !script.changed;\n }, [script.changed, existingFunctionUrl]);\n};\n\nexport const useDeployHandler = ({ state, script }: { state: Partial<DeployState>; script: ScriptType }) => {\n const { space, fn, client, existingFunctionUrl } = useDeployDeps({ script });\n const { t } = useTranslation(SCRIPT_PLUGIN);\n\n return useCallback(async () => {\n if (!script.source || !space) {\n return;\n }\n\n state.error = undefined;\n state.deploying = true;\n\n try {\n const existingFunctionId = existingFunctionUrl?.split('/').at(-1);\n\n const bundler = new Bundler({ platform: 'browser', sandboxedModules: [], remoteModules: {} });\n const buildResult = await bundler.bundle({ source: script.source.target!.content });\n if (buildResult.error || !buildResult.bundle) {\n throw buildResult.error;\n }\n\n const { functionId, version, meta } = await uploadWorkerFunction({\n client,\n spaceId: space.id,\n version: fn ? incrementSemverPatch(fn.version) : '0.0.1',\n functionId: existingFunctionId,\n source: buildResult.bundle,\n });\n if (functionId === undefined || version === undefined) {\n throw new Error(`Upload didn't return expected data: functionId=${functionId}, version=${version}`);\n }\n\n log.info('function uploaded', { functionId, version });\n if (fn) {\n fn.version = version;\n }\n\n const deployedFunction =\n fn ?? space.db.add(create(FunctionType, { name: functionId, version, source: makeRef(script) }));\n\n script.changed = false;\n if (script.description !== undefined && script.description.trim() !== '') {\n deployedFunction.description = script.description;\n } else if (meta.description) {\n deployedFunction.description = meta.description;\n } else {\n log.verbose('no description in function metadata', { functionId });\n }\n\n if (meta.inputSchema) {\n deployedFunction.inputSchema = meta.inputSchema;\n } else {\n log.verbose('no input schema in function metadata', { functionId });\n }\n\n if (meta.outputSchema) {\n deployedFunction.outputSchema = meta.outputSchema;\n } else {\n log.verbose('no output schema in function metadata', { functionId });\n }\n\n setUserFunctionUrlInMetadata(getMeta(deployedFunction), `/${space.id}/${functionId}`);\n } catch (err: any) {\n log.catch(err);\n state.error = t('upload failed label');\n }\n state.deploying = false;\n }, [fn, client, t, existingFunctionUrl, script, script.name, script.source, space?.id ?? null]);\n};\n\nexport const useCopyHandler = ({ state }: { state: Partial<DeployState> }) =>\n useCallback(async () => {\n if (!state.functionUrl) {\n return;\n }\n await navigator.clipboard.writeText(state.functionUrl);\n }, [state.functionUrl]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { create } from '@dxos/live-object';\n\nimport { type DeployState } from './deploy';\n\nexport type ScriptToolbarState = Partial<DeployState>;\n\n// TODO(burdon): Replace with context provider?\nexport const useToolbarState = (initialState: ScriptToolbarState = {}) => {\n return useMemo(() => create<ScriptToolbarState>(initialState), []);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { format } from 'prettier';\nimport prettierPluginEstree from 'prettier/plugins/estree';\nimport prettierPluginTypescript from 'prettier/plugins/typescript';\nimport { useCallback } from 'react';\n\nimport { type ScriptType } from '@dxos/functions/types';\nimport { log } from '@dxos/log';\nimport { createMenuAction } from '@dxos/react-ui-menu';\n\nimport { SCRIPT_PLUGIN } from '../meta';\n\nexport type FormatActionProperties = { type: 'format' };\n\nexport const createFormat = () => {\n const formatAction = createMenuAction('format', {\n label: ['format label', { ns: SCRIPT_PLUGIN }],\n icon: 'ph--magic-wand--regular',\n });\n\n return {\n nodes: [formatAction],\n edges: [{ source: 'root', target: 'format' }],\n };\n};\n\nexport const useFormatHandler = ({ script }: { script: ScriptType }) =>\n useCallback(async () => {\n if (!script.source) {\n return;\n }\n\n try {\n script.source.target!.content = await format(script.source.target!.content, {\n parser: 'typescript',\n plugins: [prettierPluginEstree, prettierPluginTypescript],\n semi: true,\n singleQuote: true,\n });\n } catch (err: any) {\n // TODO(wittjosiah): Show error in UI.\n log.catch(err);\n }\n }, [script.source]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { FUNCTIONS_PRESET_META_KEY, type ScriptType } from '@dxos/functions/types';\nimport { getMeta } from '@dxos/live-object';\nimport { createMenuItemGroup, createMenuAction } from '@dxos/react-ui-menu';\n\nimport { SCRIPT_PLUGIN } from '../meta';\nimport { templates } from '../templates';\n\nexport type TemplateActionProperties = { type: 'template'; value: string };\n\nconst createTemplateSelectGroup = () => {\n return createMenuItemGroup('template-select', {\n label: ['template select group label', { ns: SCRIPT_PLUGIN }],\n variant: 'dropdownMenu',\n });\n};\n\nconst createTemplateSelectActions = () => {\n return templates.map((template) => {\n return createMenuAction<TemplateActionProperties>(`template--${template.id}`, {\n label: template.name,\n value: template.id,\n type: 'template',\n });\n });\n};\n\nexport const createTemplateSelect = () => {\n const templateSelectGroup = createTemplateSelectGroup();\n const templateSelectActions = createTemplateSelectActions();\n return {\n nodes: [templateSelectGroup, ...templateSelectActions],\n edges: [\n { source: 'root', target: 'template-select' },\n ...templateSelectActions.map((action) => ({ source: 'template-select', target: action.id })),\n ],\n };\n};\n\nexport const useTemplateSelectHandler = ({ script }: { script: ScriptType }) => {\n return useCallback(\n (templateId: string) => {\n const template = templates.find((template) => template.id === templateId);\n if (template) {\n script.name = template.name;\n script.source!.target!.content = template.source;\n const metaKeys = getMeta(script).keys;\n const oldPresetIndex = metaKeys.findIndex((key) => key.source === FUNCTIONS_PRESET_META_KEY);\n if (oldPresetIndex >= 0) {\n metaKeys.splice(oldPresetIndex, 1);\n }\n if (template.presetId) {\n metaKeys.push({ source: FUNCTIONS_PRESET_META_KEY, id: template.presetId });\n }\n }\n },\n [script],\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createMenuAction } from '@dxos/react-ui-menu';\n\nimport { SCRIPT_PLUGIN } from '../meta';\n\nexport type ViewType = /* 'editor' | 'split' | */ 'logs';\n\nexport type ViewState = { view: ViewType };\n\nexport type ViewActionProperties = { type: 'view'; value: ViewType };\n\nconst views: Record<ViewType, string> = {\n // editor: 'ph--code--regular',\n // split: 'ph--square-split-vertical--regular',\n logs: 'ph--clock-counter-clockwise--regular',\n};\n\nconst createViewActions = (state: Partial<ViewState>) => {\n return Object.entries(views).map(([viewType, icon]) => {\n return createMenuAction<ViewActionProperties>(`view--${viewType}`, {\n type: 'view',\n value: viewType as ViewType,\n label: [`view ${viewType} label`, { ns: SCRIPT_PLUGIN }],\n icon,\n });\n });\n};\n\nexport const createView = (state: Partial<ViewState>) => {\n const viewActions = createViewActions(state);\n return {\n nodes: viewActions,\n edges: viewActions.map((action) => ({ source: 'root', target: action.id })),\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { type ScriptType } from '@dxos/functions/types';\nimport { log } from '@dxos/log';\nimport { DeckAction, surfaceVariant } from '@dxos/plugin-deck/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { type MenuAction, type MenuActionHandler } from '@dxos/react-ui-menu';\n\nimport { type DeployActionProperties, useDeployHandler, useCopyHandler } from './deploy';\nimport { type FormatActionProperties, useFormatHandler } from './format';\nimport { type TemplateActionProperties, useTemplateSelectHandler } from './template';\nimport { type ScriptToolbarState } from './useToolbarState';\nimport { type ViewActionProperties } from './view';\n\nexport type ScriptToolbarActionProperties =\n | TemplateActionProperties\n | ViewActionProperties\n | FormatActionProperties\n | DeployActionProperties;\n\nexport type ScriptToolbarAction = MenuAction<ScriptToolbarActionProperties>;\n\nexport const useToolbarAction = (props: { state: ScriptToolbarState; script: ScriptType }) => {\n const handleTemplateSelect = useTemplateSelectHandler(props);\n const handleFormat = useFormatHandler(props);\n const handleDeploy = useDeployHandler(props);\n const handleCopy = useCopyHandler(props);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n return useCallback(\n ((action: ScriptToolbarAction) => {\n switch (action.properties.type) {\n case 'view':\n void dispatch(\n createIntent(DeckAction.ChangeCompanion, {\n primary: fullyQualifiedId(props.script),\n companion: surfaceVariant('logs'),\n }),\n );\n break;\n case 'template':\n handleTemplateSelect(action.properties.value);\n break;\n case 'format':\n void handleFormat();\n break;\n case 'deploy':\n void handleDeploy();\n break;\n case 'copy':\n void handleCopy();\n break;\n default:\n log.error('Unknown action type', action);\n }\n }) as MenuActionHandler,\n [handleTemplateSelect, handleFormat, handleDeploy, handleCopy],\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { decodeReference } from '@dxos/echo-protocol';\nimport { type InvocationTraceEvent, type ScriptType, type TraceEvent } from '@dxos/functions/types';\nimport { useQueue } from '@dxos/react-client/echo';\nimport { Icon, List, ListItem, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { useDeployDeps } from '../../hooks';\nimport { SCRIPT_PLUGIN } from '../../meta';\n\nexport type LogsPanelProps = ThemedClassName<{\n script: ScriptType;\n}>;\n\nexport const LogsPanel = ({ script, classNames }: LogsPanelProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n // TODO(wittjosiah): Refactor these hooks.\n const { space, existingFunctionUrl } = useDeployDeps({ script });\n const invocationTraceQueue = useQueue<InvocationTraceEvent>(space?.properties.invocationTraceQueue?.dxn, {\n pollInterval: 500,\n });\n const [selected, setSelected] = useState<InvocationTraceEvent>();\n const workerDxn = `dxn:worker:${existingFunctionUrl?.split('/').at(-1)}`;\n\n if (!invocationTraceQueue) {\n return <div>{t('no invocations message')}</div>;\n }\n\n const handleOpenChange = useCallback((trace: InvocationTraceEvent, open: boolean) => {\n setSelected(open ? trace : undefined);\n }, []);\n\n return (\n <List classNames={mx('overflow-y-auto', classNames)}>\n {invocationTraceQueue.items\n .filter((trace) => decodeReference(trace.invocationTarget).dxn?.toString() === workerDxn)\n .map((trace) => (\n <InvocationTraceItem\n key={trace.id}\n trace={trace}\n open={selected?.id === trace.id}\n setOpen={handleOpenChange}\n />\n ))}\n </List>\n );\n};\n\nconst InvocationTraceItem = ({\n trace,\n open,\n setOpen,\n}: {\n trace: InvocationTraceEvent;\n open?: boolean;\n setOpen?: (trace: InvocationTraceEvent, open: boolean) => void;\n}) => {\n const eventQueue = useQueue<TraceEvent>(open ? decodeReference(trace.invocationTraceQueue).dxn : undefined);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n setOpen?.(trace, open);\n },\n [trace, setOpen],\n );\n\n const logs = useMemo(() => eventQueue?.items.flatMap((event) => event.logs), [eventQueue?.items]);\n const heading =\n 'bodyText' in trace.input && typeof trace.input.bodyText === 'string'\n ? trace.input.bodyText\n : JSON.stringify(trace.input);\n\n return (\n <ListItem.Root key={trace.id} collapsible open={open} onOpenChange={handleOpenChange}>\n <div className='flex items-center gap-2'>\n <ListItem.OpenTrigger />\n <ListItem.Endcap classNames='flex items-center justify-center'>\n <Icon icon={trace.outcome === 'success' ? 'ph--check--regular' : 'ph--x--regular'} size={5} />\n </ListItem.Endcap>\n <ListItem.Heading classNames='flex-1 flex items-center gap-2 truncate'>\n <span>{new Date(trace.timestampMs).toLocaleString()}</span>\n <span>{heading}</span>\n </ListItem.Heading>\n </div>\n {logs && (\n <ListItem.CollapsibleContent>\n <div className='flex items-center gap-2'>\n <span>Duration:</span>\n <span>{trace.durationMs}ms</span>\n </div>\n <pre>\n <div>{JSON.stringify(trace.input, null, 2)}</div>\n {logs.map((log, index) => {\n return <div key={index}>{JSON.stringify(log, null, 2)}</div>;\n })}\n </pre>\n </ListItem.CollapsibleContent>\n )}\n </ListItem.Root>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["useCallback", "useEffect", "useMemo", "FunctionType", "getInvocationUrl", "getUserFunctionUrlInMetadata", "incrementSemverPatch", "setUserFunctionUrlInMetadata", "uploadWorkerFunction", "Bundler", "log", "useClient", "Filter", "create", "getMeta", "getSpace", "makeRef", "useQuery", "useTranslation", "createMenuAction", "createDeploy", "state", "errorItem", "createMenuAction", "label", "error", "ns", "SCRIPT_PLUGIN", "icon", "hidden", "deployAction", "type", "deploying", "disabled", "classNames", "copyAction", "functionUrl", "nodes", "edges", "source", "target", "useDeployDeps", "script", "space", "getSpace", "fn", "useQuery", "Filter", "schema", "FunctionType", "client", "useClient", "existingFunctionUrl", "useMemo", "getUserFunctionUrlInMetadata", "getMeta", "useDeployState", "useEffect", "getInvocationUrl", "config", "values", "runtime", "services", "edge", "url", "spaceId", "id", "deployed", "Boolean", "changed", "useDeployHandler", "t", "useTranslation", "useCallback", "undefined", "existingFunctionId", "split", "at", "bundler", "Bundler", "platform", "sandboxedModules", "remoteModules", "buildResult", "bundle", "content", "functionId", "version", "meta", "uploadWorkerFunction", "incrementSemverPatch", "Error", "log", "info", "deployedFunction", "db", "add", "create", "name", "makeRef", "description", "trim", "verbose", "inputSchema", "outputSchema", "setUserFunctionUrlInMetadata", "err", "catch", "useCopyHandler", "navigator", "clipboard", "writeText", "useMemo", "create", "useToolbarState", "initialState", "useMemo", "create", "format", "prettierPluginEstree", "prettierPluginTypescript", "useCallback", "log", "createMenuAction", "createFormat", "formatAction", "createMenuAction", "label", "ns", "SCRIPT_PLUGIN", "icon", "nodes", "edges", "source", "target", "useFormatHandler", "script", "useCallback", "content", "format", "parser", "plugins", "prettierPluginEstree", "prettierPluginTypescript", "semi", "singleQuote", "err", "log", "catch", "useCallback", "FUNCTIONS_PRESET_META_KEY", "getMeta", "createMenuItemGroup", "createMenuAction", "createTemplateSelectGroup", "createMenuItemGroup", "label", "ns", "SCRIPT_PLUGIN", "variant", "createTemplateSelectActions", "templates", "map", "template", "createMenuAction", "id", "name", "value", "type", "createTemplateSelect", "templateSelectGroup", "templateSelectActions", "nodes", "edges", "source", "target", "action", "useTemplateSelectHandler", "script", "useCallback", "templateId", "find", "content", "metaKeys", "getMeta", "keys", "oldPresetIndex", "findIndex", "key", "FUNCTIONS_PRESET_META_KEY", "splice", "presetId", "push", "createMenuAction", "views", "logs", "createViewActions", "state", "Object", "entries", "map", "viewType", "icon", "createMenuAction", "type", "value", "label", "ns", "SCRIPT_PLUGIN", "createView", "viewActions", "nodes", "edges", "action", "source", "target", "id", "useCallback", "createIntent", "useIntentDispatcher", "log", "DeckAction", "surfaceVariant", "fullyQualifiedId", "useToolbarAction", "props", "handleTemplateSelect", "useTemplateSelectHandler", "handleFormat", "useFormatHandler", "handleDeploy", "useDeployHandler", "handleCopy", "useCopyHandler", "dispatchPromise", "dispatch", "useIntentDispatcher", "useCallback", "action", "properties", "type", "createIntent", "DeckAction", "ChangeCompanion", "primary", "fullyQualifiedId", "script", "companion", "surfaceVariant", "value", "log", "error", "React", "useCallback", "useMemo", "useState", "decodeReference", "useQueue", "Icon", "List", "ListItem", "useTranslation", "mx", "LogsPanel", "script", "classNames", "t", "useTranslation", "SCRIPT_PLUGIN", "space", "existingFunctionUrl", "useDeployDeps", "invocationTraceQueue", "useQueue", "properties", "dxn", "pollInterval", "selected", "setSelected", "useState", "workerDxn", "split", "at", "div", "handleOpenChange", "useCallback", "trace", "open", "undefined", "List", "mx", "items", "filter", "decodeReference", "invocationTarget", "toString", "map", "InvocationTraceItem", "key", "id", "setOpen", "eventQueue", "logs", "useMemo", "flatMap", "event", "heading", "input", "bodyText", "JSON", "stringify", "ListItem", "Root", "collapsible", "onOpenChange", "className", "OpenTrigger", "Endcap", "Icon", "icon", "outcome", "size", "Heading", "span", "Date", "timestampMs", "toLocaleString", "CollapsibleContent", "durationMs", "pre", "log", "index"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  SCRIPT_PLUGIN
3
- } from "./chunk-FVVCAWNP.mjs";
3
+ } from "./chunk-27LV6ARH.mjs";
4
4
 
5
5
  // packages/plugins/experimental/plugin-script/src/capabilities/capabilities.ts
6
6
  import { defineCapability } from "@dxos/app-framework";
@@ -12,4 +12,4 @@ var ScriptCapabilities;
12
12
  export {
13
13
  ScriptCapabilities
14
14
  };
15
- //# sourceMappingURL=chunk-6MOQ4BP3.mjs.map
15
+ //# sourceMappingURL=chunk-FG66JYON.mjs.map
@@ -0,0 +1,467 @@
1
+ import {
2
+ SCRIPT_PLUGIN
3
+ } from "./chunk-27LV6ARH.mjs";
4
+
5
+ // packages/plugins/experimental/plugin-script/src/components/DebugPanel/DebugPanel.tsx
6
+ import React, { forwardRef, useEffect, useRef, useState } from "react";
7
+ import { log } from "@dxos/log";
8
+ import { Avatar, Icon, Input, Toolbar, useTranslation } from "@dxos/react-ui";
9
+ import { SyntaxHighlighter } from "@dxos/react-ui-syntax-highlighter";
10
+ import { errorText, mx } from "@dxos/react-ui-theme";
11
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/components/DebugPanel/DebugPanel.tsx";
12
+ var DebugPanel = ({ classNames, functionUrl }) => {
13
+ const { t } = useTranslation(SCRIPT_PLUGIN);
14
+ const inputRef = useRef(null);
15
+ const [input, setInput] = useState("");
16
+ const [result, setResult] = useState("");
17
+ const [state, setState] = useState(null);
18
+ const [history, setHistory] = useState([]);
19
+ const scrollerRef = useRef(null);
20
+ const handleScroll = () => {
21
+ if (scrollerRef.current) {
22
+ scrollerRef.current.scrollTop = scrollerRef.current.scrollHeight;
23
+ }
24
+ };
25
+ const controller = useRef();
26
+ useEffect(() => {
27
+ return () => {
28
+ handleStop();
29
+ };
30
+ }, []);
31
+ const handleStop = () => {
32
+ controller.current?.abort("stop");
33
+ controller.current = void 0;
34
+ };
35
+ const handleClear = () => {
36
+ handleStop();
37
+ setInput("");
38
+ setResult("");
39
+ setHistory([]);
40
+ inputRef.current?.focus();
41
+ };
42
+ const handleResponse = ({ text, data, error } = {}) => {
43
+ controller.current = void 0;
44
+ setHistory((history2) => [
45
+ ...history2,
46
+ {
47
+ type: "response",
48
+ text,
49
+ data,
50
+ error
51
+ }
52
+ ]);
53
+ setResult("");
54
+ setState(null);
55
+ handleScroll();
56
+ };
57
+ const handleRequest = async (input2) => {
58
+ try {
59
+ setState("pending");
60
+ let data = null;
61
+ if (input2.charAt(0) === "{") {
62
+ try {
63
+ const validJsonString = input2.replace(/'/g, '"').replace(/([{,]\s*)([a-zA-Z0-9_]+)(\s*:)/g, '$1"$2"$3');
64
+ data = JSON.parse(validJsonString);
65
+ input2 = JSON.stringify(data, null, 2);
66
+ } catch (err) {
67
+ inputRef.current?.focus();
68
+ return;
69
+ }
70
+ }
71
+ setInput("");
72
+ setResult("");
73
+ setHistory((history2) => [
74
+ ...history2,
75
+ {
76
+ type: "request",
77
+ text: input2
78
+ }
79
+ ]);
80
+ setTimeout(() => {
81
+ handleScroll();
82
+ });
83
+ controller.current = new AbortController();
84
+ const response = await fetch(functionUrl, {
85
+ signal: controller.current.signal,
86
+ method: "POST",
87
+ body: input2,
88
+ headers: {
89
+ "Content-Type": data ? "application/json" : "text/plain"
90
+ }
91
+ });
92
+ if (!response.ok) {
93
+ const text2 = await response.text();
94
+ handleResponse({
95
+ error: new Error(text2 || response.statusText || String(response.status))
96
+ });
97
+ return;
98
+ }
99
+ const contentType = response.headers.get("content-type");
100
+ if (contentType === "application/json") {
101
+ const data2 = await response.json();
102
+ handleResponse({
103
+ data: data2
104
+ });
105
+ return;
106
+ }
107
+ setState("responding");
108
+ let text = "";
109
+ const reader = response.body.getReader();
110
+ const pump = async ({ done, value }) => {
111
+ text = text + new TextDecoder().decode(value);
112
+ if (!controller.current || done) {
113
+ handleResponse({
114
+ text
115
+ });
116
+ return;
117
+ }
118
+ setResult(text);
119
+ setTimeout(() => {
120
+ handleScroll();
121
+ });
122
+ return reader.read().then(pump);
123
+ };
124
+ void reader.read().then(pump).catch((err) => {
125
+ if (err.name !== "AbortError") {
126
+ log.catch(err, void 0, {
127
+ F: __dxlog_file,
128
+ L: 146,
129
+ S: void 0,
130
+ C: (f, a) => f(...a)
131
+ });
132
+ }
133
+ });
134
+ } catch (err) {
135
+ if (err !== "stop") {
136
+ const error = err instanceof Error ? err : new Error(err);
137
+ handleResponse({
138
+ error
139
+ });
140
+ log.catch(err, void 0, {
141
+ F: __dxlog_file,
142
+ L: 153,
143
+ S: void 0,
144
+ C: (f, a) => f(...a)
145
+ });
146
+ } else {
147
+ handleResponse();
148
+ }
149
+ }
150
+ };
151
+ return /* @__PURE__ */ React.createElement("div", {
152
+ className: mx("flex flex-col h-full overflow-hidden", classNames)
153
+ }, /* @__PURE__ */ React.createElement(MessageThread, {
154
+ ref: scrollerRef,
155
+ state,
156
+ result,
157
+ history
158
+ }), /* @__PURE__ */ React.createElement(Toolbar.Root, {
159
+ classNames: "p-1"
160
+ }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.TextInput, {
161
+ ref: inputRef,
162
+ autoFocus: true,
163
+ placeholder: t("function request placeholder"),
164
+ value: input,
165
+ onChange: (ev) => setInput(ev.target.value),
166
+ onKeyDown: (ev) => ev.key === "Enter" && handleRequest(input)
167
+ })), /* @__PURE__ */ React.createElement(Toolbar.Button, {
168
+ onClick: () => handleRequest(input)
169
+ }, /* @__PURE__ */ React.createElement(Icon, {
170
+ icon: "ph--play--regular",
171
+ size: 4
172
+ })), /* @__PURE__ */ React.createElement(Toolbar.Button, {
173
+ onClick: () => state ? handleStop() : handleClear()
174
+ }, /* @__PURE__ */ React.createElement(Icon, {
175
+ icon: state ? "ph--stop--regular" : "ph--trash--regular",
176
+ size: 4
177
+ }))));
178
+ };
179
+ var MessageThread = /* @__PURE__ */ forwardRef(({ state, history, result }, forwardedRef) => {
180
+ if (!history.length && !result.length) {
181
+ return null;
182
+ }
183
+ return /* @__PURE__ */ React.createElement("div", {
184
+ ref: forwardedRef,
185
+ className: "flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto"
186
+ }, history.map((message, i) => /* @__PURE__ */ React.createElement("div", {
187
+ key: i,
188
+ className: "grid grid-cols-[2rem_1fr_2rem]"
189
+ }, /* @__PURE__ */ React.createElement("div", {
190
+ className: "p-1"
191
+ }, message.type === "response" && /* @__PURE__ */ React.createElement(RobotAvatar, null)), /* @__PURE__ */ React.createElement("div", {
192
+ className: "overflow-auto"
193
+ }, /* @__PURE__ */ React.createElement(MessageItem, {
194
+ message
195
+ })))), result?.length > 0 && /* @__PURE__ */ React.createElement("div", {
196
+ className: "grid grid-cols-[2rem_1fr_2rem]"
197
+ }, /* @__PURE__ */ React.createElement("div", {
198
+ className: "p-1"
199
+ }, state === "pending" && /* @__PURE__ */ React.createElement(Icon, {
200
+ icon: "ph--spinner--regular",
201
+ size: 6,
202
+ classNames: "animate-spin"
203
+ }) || /* @__PURE__ */ React.createElement(Icon, {
204
+ icon: "ph--robot--regular",
205
+ size: 6,
206
+ classNames: "animate-[pulse_1s_ease-in-out_infinite]"
207
+ })), /* @__PURE__ */ React.createElement("div", {
208
+ className: "overflow-auto"
209
+ }, /* @__PURE__ */ React.createElement(MessageItem, {
210
+ message: {
211
+ type: "response",
212
+ text: result
213
+ }
214
+ }))));
215
+ });
216
+ var MessageItem = ({ classNames, message }) => {
217
+ const { type, text, data, error } = message;
218
+ const wrapper = "p-1 px-2 rounded-lg bg-hoverSurface overflow-auto";
219
+ return /* @__PURE__ */ React.createElement("div", {
220
+ className: mx("flex", type === "request" ? "ml-[1rem] justify-end" : "mr-[1rem]", classNames)
221
+ }, error && /* @__PURE__ */ React.createElement("div", {
222
+ className: mx(wrapper, "whitespace-pre", errorText)
223
+ }, String(error)), text !== void 0 && /* @__PURE__ */ React.createElement("div", {
224
+ className: mx(wrapper, type === "request" && "bg-primary-400 dark:bg-primary-600")
225
+ }, text || "\xD8"), data && /* @__PURE__ */ React.createElement(SyntaxHighlighter, {
226
+ language: "json",
227
+ className: mx(wrapper, "px-8 py-2 text-xs")
228
+ }, JSON.stringify(data, null, 2)));
229
+ };
230
+ var RobotAvatar = () => /* @__PURE__ */ React.createElement(Avatar.Root, {
231
+ size: 6,
232
+ variant: "circle"
233
+ }, /* @__PURE__ */ React.createElement(Avatar.Frame, null, /* @__PURE__ */ React.createElement(Avatar.Icon, {
234
+ icon: "ph--robot--regular"
235
+ })));
236
+
237
+ // packages/plugins/experimental/plugin-script/src/components/ScriptSettings/ScriptSettings.tsx
238
+ import React2 from "react";
239
+ import { useClient } from "@dxos/react-client";
240
+ import { Button, Select, useTranslation as useTranslation2 } from "@dxos/react-ui";
241
+ import { EditorInputModes } from "@dxos/react-ui-editor";
242
+ import { DeprecatedFormContainer, DeprecatedFormInput } from "@dxos/react-ui-form";
243
+ var ScriptSettings = ({ settings }) => {
244
+ const { t } = useTranslation2(SCRIPT_PLUGIN);
245
+ const client = useClient();
246
+ const handleAuthenticate = async () => {
247
+ const { identityKey } = client.halo.identity.get();
248
+ await client.halo.writeCredentials([
249
+ {
250
+ issuer: identityKey,
251
+ issuanceDate: /* @__PURE__ */ new Date(),
252
+ subject: {
253
+ id: identityKey,
254
+ assertion: {
255
+ "@type": "dxos.halo.credentials.ServiceAccess",
256
+ serverName: "hub.dxos.network",
257
+ serverKey: identityKey,
258
+ identityKey,
259
+ capabilities: [
260
+ "composer:beta"
261
+ ]
262
+ }
263
+ }
264
+ }
265
+ ]);
266
+ };
267
+ return /* @__PURE__ */ React2.createElement(DeprecatedFormContainer, null, /* @__PURE__ */ React2.createElement(DeprecatedFormInput, {
268
+ label: t("authenticate action label")
269
+ }, /* @__PURE__ */ React2.createElement(Button, {
270
+ onClick: handleAuthenticate
271
+ }, t("authenticate button label"))), /* @__PURE__ */ React2.createElement(DeprecatedFormInput, {
272
+ label: t("editor input mode label")
273
+ }, /* @__PURE__ */ React2.createElement(Select.Root, {
274
+ value: settings.editorInputMode ?? "default",
275
+ onValueChange: (value) => {
276
+ settings.editorInputMode = value;
277
+ }
278
+ }, /* @__PURE__ */ React2.createElement(Select.TriggerButton, {
279
+ placeholder: t("select editor input mode placeholder")
280
+ }), /* @__PURE__ */ React2.createElement(Select.Portal, null, /* @__PURE__ */ React2.createElement(Select.Content, null, /* @__PURE__ */ React2.createElement(Select.Viewport, null, EditorInputModes.map((mode) => /* @__PURE__ */ React2.createElement(Select.Option, {
281
+ key: mode,
282
+ value: mode
283
+ }, t(`settings editor input mode ${mode} label`)))))))));
284
+ };
285
+
286
+ // packages/plugins/experimental/plugin-script/src/components/ScriptSettingsPanel.tsx
287
+ import { Octokit } from "@octokit/core";
288
+ import React3, { useCallback, useEffect as useEffect2, useState as useState2 } from "react";
289
+ import { createIntent, SettingsAction, useIntentDispatcher } from "@dxos/app-framework";
290
+ import { FunctionType, getInvocationUrl, getUserFunctionUrlInMetadata } from "@dxos/functions/types";
291
+ import { log as log2 } from "@dxos/log";
292
+ import { useClient as useClient2 } from "@dxos/react-client";
293
+ import { Filter, getMeta, getSpace, useQuery } from "@dxos/react-client/echo";
294
+ import { Button as Button2, Clipboard, Input as Input2, Separator, useControlledState, useTranslation as useTranslation3 } from "@dxos/react-ui";
295
+ import { AccessTokenType } from "@dxos/schema";
296
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/components/ScriptSettingsPanel.tsx";
297
+ var kebabize = (str) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? "-" : "") + $.toLowerCase());
298
+ var ScriptSettingsPanel = ({ script }) => {
299
+ const { t } = useTranslation3(SCRIPT_PLUGIN);
300
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
301
+ const client = useClient2();
302
+ const space = getSpace(script);
303
+ const [fn] = useQuery(space, Filter.schema(FunctionType, {
304
+ source: script
305
+ }));
306
+ const [githubToken] = useQuery(space, Filter.schema(AccessTokenType, {
307
+ source: "github.com"
308
+ }));
309
+ const gistKey = getMeta(script).keys.find(({ source }) => source === "github.com");
310
+ const [gistUrl, setGistUrl] = useState2();
311
+ useEffect2(() => {
312
+ const token = githubToken?.token;
313
+ const gistId = gistKey?.id;
314
+ if (!token || !gistId) {
315
+ setGistUrl(void 0);
316
+ return;
317
+ }
318
+ const timeout = setTimeout(async () => {
319
+ try {
320
+ const octokit = new Octokit({
321
+ auth: githubToken.token
322
+ });
323
+ const response = await octokit.request("GET /gists/{gist_id}", {
324
+ gist_id: gistId
325
+ });
326
+ setGistUrl(response.data.html_url);
327
+ } catch (err) {
328
+ log2.catch(err, void 0, {
329
+ F: __dxlog_file2,
330
+ L: 52,
331
+ S: void 0,
332
+ C: (f, a) => f(...a)
333
+ });
334
+ setGistUrl(void 0);
335
+ }
336
+ });
337
+ return () => clearTimeout(timeout);
338
+ }, [
339
+ githubToken,
340
+ gistKey
341
+ ]);
342
+ const [binding, setBinding] = useControlledState(fn?.binding ?? "");
343
+ const handleBindingChange = useCallback((event) => {
344
+ setBinding(event.target.value);
345
+ }, [
346
+ setBinding
347
+ ]);
348
+ const handleBindingBlur = useCallback(() => {
349
+ fn.binding = binding;
350
+ }, [
351
+ fn,
352
+ binding
353
+ ]);
354
+ const functionPath = fn && getUserFunctionUrlInMetadata(getMeta(fn));
355
+ const functionUrl = functionPath && getInvocationUrl(functionPath, client.config.values.runtime?.services?.edge?.url ?? "", {
356
+ spaceId: space?.id
357
+ });
358
+ const handleOpenTokenManager = useCallback(() => dispatch(createIntent(SettingsAction.Open, {
359
+ plugin: "dxos.org/plugin/token-manager"
360
+ })), []);
361
+ const [publishing, setPublishing] = useState2(false);
362
+ const handlePublish = useCallback(async () => {
363
+ setPublishing(true);
364
+ const octokit = new Octokit({
365
+ auth: githubToken.token
366
+ });
367
+ const source = await script.source.load();
368
+ const filename = script.name ? kebabize(script.name) : "composer-script";
369
+ const files = {
370
+ [`${filename}.ts`]: {
371
+ content: source.content
372
+ }
373
+ };
374
+ try {
375
+ const meta = getMeta(script);
376
+ const githubKey = meta.keys.find(({ source: source2 }) => source2 === "github.com");
377
+ const gistId = githubKey?.id;
378
+ if (gistId) {
379
+ await octokit.request("PATCH /gists/{gist_id}", {
380
+ gist_id: gistId,
381
+ files
382
+ });
383
+ } else {
384
+ const response = await octokit.request("POST /gists", {
385
+ public: true,
386
+ files
387
+ });
388
+ if (response.data.id) {
389
+ meta.keys.push({
390
+ source: "github.com",
391
+ id: response.data.id
392
+ });
393
+ }
394
+ }
395
+ } finally {
396
+ setPublishing(false);
397
+ }
398
+ }, [
399
+ script,
400
+ githubToken
401
+ ]);
402
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement("div", {
403
+ role: "form",
404
+ className: "flex flex-col w-full p-2 gap-4"
405
+ }, /* @__PURE__ */ React3.createElement(Input2.Root, null, /* @__PURE__ */ React3.createElement("div", {
406
+ role: "none",
407
+ className: "flex flex-col gap-1"
408
+ }, /* @__PURE__ */ React3.createElement(Input2.Label, null, t("description label")), /* @__PURE__ */ React3.createElement(Input2.TextInput, {
409
+ placeholder: t("description placeholder"),
410
+ value: script.description ?? "",
411
+ onChange: (event) => {
412
+ script.description = event.target.value;
413
+ }
414
+ })))), fn && functionUrl && /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(Separator, null), /* @__PURE__ */ React3.createElement("div", {
415
+ role: "form",
416
+ className: "flex flex-col w-full p-2 gap-4"
417
+ }, /* @__PURE__ */ React3.createElement("h2", null, t("remote function settings heading")), /* @__PURE__ */ React3.createElement(Input2.Root, null, /* @__PURE__ */ React3.createElement("div", {
418
+ role: "none",
419
+ className: "flex flex-col gap-1"
420
+ }, /* @__PURE__ */ React3.createElement(Input2.Label, null, t("function url label")), /* @__PURE__ */ React3.createElement("div", {
421
+ role: "none",
422
+ className: "flex gap-1"
423
+ }, /* @__PURE__ */ React3.createElement(Input2.TextInput, {
424
+ disabled: true,
425
+ value: functionUrl,
426
+ onChange: (event) => {
427
+ fn.name = event.target.value;
428
+ }
429
+ }), /* @__PURE__ */ React3.createElement(Clipboard.IconButton, {
430
+ value: functionUrl
431
+ })))), /* @__PURE__ */ React3.createElement(Input2.Root, null, /* @__PURE__ */ React3.createElement("div", {
432
+ role: "none",
433
+ className: "flex flex-col gap-1"
434
+ }, /* @__PURE__ */ React3.createElement(Input2.Label, null, t("function binding label")), /* @__PURE__ */ React3.createElement(Input2.TextInput, {
435
+ placeholder: t("function binding placeholder"),
436
+ value: binding,
437
+ onChange: handleBindingChange,
438
+ onBlur: handleBindingBlur
439
+ }))))), /* @__PURE__ */ React3.createElement(Separator, null), /* @__PURE__ */ React3.createElement("div", {
440
+ className: "flex flex-col w-full p-2 gap-4"
441
+ }, /* @__PURE__ */ React3.createElement("div", null, /* @__PURE__ */ React3.createElement("h2", null, t("script publish settings label")), /* @__PURE__ */ React3.createElement("p", {
442
+ className: "text-description text-sm"
443
+ }, t("script publish settings description"))), !githubToken && /* @__PURE__ */ React3.createElement("div", {
444
+ className: "flex flex-col items-center justify-center gap-2"
445
+ }, /* @__PURE__ */ React3.createElement("span", null, t("no github token label")), /* @__PURE__ */ React3.createElement(Button2, {
446
+ onClick: handleOpenTokenManager
447
+ }, t("open token manager label"))), githubToken && /* @__PURE__ */ React3.createElement("div", {
448
+ className: "flex justify-end gap-2"
449
+ }, gistUrl && /* @__PURE__ */ React3.createElement(Clipboard.IconButton, {
450
+ value: gistUrl
451
+ }), /* @__PURE__ */ React3.createElement(Button2, {
452
+ disabled: publishing,
453
+ onClick: handlePublish
454
+ }, t(publishing ? "publishing label" : "publish label")))));
455
+ };
456
+
457
+ // packages/plugins/experimental/plugin-script/src/components/index.ts
458
+ import { lazy } from "react";
459
+ var ScriptContainer = lazy(() => import("./ScriptContainer-7PTOJ4KY.mjs"));
460
+
461
+ export {
462
+ DebugPanel,
463
+ ScriptSettings,
464
+ ScriptSettingsPanel,
465
+ ScriptContainer
466
+ };
467
+ //# sourceMappingURL=chunk-QHE53FDV.mjs.map