@dxos/plugin-script 0.10.0 → 0.11.1
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/lib/ScriptPlugin.mjs +25 -0
- package/dist/lib/ScriptPlugin.mjs.map +1 -0
- package/dist/lib/ScriptPlugin.node.mjs +11 -0
- package/dist/lib/ScriptPlugin.node.mjs.map +1 -0
- package/dist/lib/ScriptPlugin.workerd.mjs +11 -0
- package/dist/lib/ScriptPlugin.workerd.mjs.map +1 -0
- package/dist/lib/capabilities/node.mjs +11 -0
- package/dist/lib/capabilities/node.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +13 -0
- package/dist/lib/capabilities.mjs.map +1 -0
- package/dist/lib/chunk-DeploymentDialog.mjs +85 -0
- package/dist/lib/chunk-DeploymentDialog.mjs.map +1 -0
- package/dist/lib/chunk-NotebookArticle.mjs +719 -0
- package/dist/lib/chunk-NotebookArticle.mjs.map +1 -0
- package/dist/lib/chunk-ScriptArticle.mjs +67 -0
- package/dist/lib/chunk-ScriptArticle.mjs.map +1 -0
- package/dist/lib/chunk-ScriptProperties.mjs +240 -0
- package/dist/lib/chunk-ScriptProperties.mjs.map +1 -0
- package/dist/lib/chunk-ScriptSettings.mjs +40 -0
- package/dist/lib/chunk-ScriptSettings.mjs.map +1 -0
- package/dist/lib/chunk-TestContainer.mjs +40 -0
- package/dist/lib/chunk-TestContainer.mjs.map +1 -0
- package/dist/lib/chunk-app-graph-builder.mjs +33 -0
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
- package/dist/lib/chunk-compiler.mjs +60 -0
- package/dist/lib/chunk-compiler.mjs.map +1 -0
- package/dist/lib/chunk-compiler2.mjs +76 -0
- package/dist/lib/chunk-compiler2.mjs.map +1 -0
- package/dist/lib/chunk-create-object.mjs +36 -0
- package/dist/lib/chunk-create-object.mjs.map +1 -0
- package/dist/lib/chunk-create-script.mjs +32 -0
- package/dist/lib/chunk-create-script.mjs.map +1 -0
- package/dist/lib/chunk-create.mjs +34 -0
- package/dist/lib/chunk-create.mjs.map +1 -0
- package/dist/lib/chunk-delete.mjs +15 -0
- package/dist/lib/chunk-delete.mjs.map +1 -0
- package/dist/lib/chunk-deploy.mjs +53 -0
- package/dist/lib/chunk-deploy.mjs.map +1 -0
- package/dist/lib/chunk-functions.mjs +238 -0
- package/dist/lib/chunk-functions.mjs.map +1 -0
- package/dist/lib/chunk-inspect-invocations.mjs +42 -0
- package/dist/lib/chunk-inspect-invocations.mjs.map +1 -0
- package/dist/lib/chunk-install-function.mjs +40 -0
- package/dist/lib/chunk-install-function.mjs.map +1 -0
- package/dist/lib/chunk-invoke.mjs +25 -0
- package/dist/lib/chunk-invoke.mjs.map +1 -0
- package/dist/lib/chunk-meta.mjs +33 -0
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/chunk-operation-handler.mjs +13 -0
- package/dist/lib/chunk-operation-handler.mjs.map +1 -0
- package/dist/lib/chunk-query-deployed-functions.mjs +31 -0
- package/dist/lib/chunk-query-deployed-functions.mjs.map +1 -0
- package/dist/lib/chunk-react-surface.mjs +140 -0
- package/dist/lib/chunk-react-surface.mjs.map +1 -0
- package/dist/lib/chunk-read.mjs +20 -0
- package/dist/lib/chunk-read.mjs.map +1 -0
- package/dist/lib/chunk-settings.mjs +23 -0
- package/dist/lib/chunk-settings.mjs.map +1 -0
- package/dist/lib/chunk-skill-definition.mjs +10 -0
- package/dist/lib/chunk-skill-definition.mjs.map +1 -0
- package/dist/lib/chunk-skills.mjs +35 -0
- package/dist/lib/chunk-skills.mjs.map +1 -0
- package/dist/lib/{neutral/chunk-WAGQ77UQ.mjs → chunk-templates.mjs} +82 -84
- package/dist/lib/chunk-templates.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +90 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/chunk-update.mjs +27 -0
- package/dist/lib/chunk-update.mjs.map +1 -0
- package/dist/lib/chunk-util.mjs +146 -0
- package/dist/lib/chunk-util.mjs.map +1 -0
- package/dist/lib/components.mjs +618 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +12 -0
- package/dist/lib/containers.mjs.map +1 -0
- package/dist/lib/hooks.mjs +307 -0
- package/dist/lib/hooks.mjs.map +1 -0
- package/dist/lib/index.mjs +5 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/operations.mjs +7 -0
- package/dist/lib/operations.mjs.map +1 -0
- package/dist/lib/plugin.mjs +9 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/skills.mjs +2 -0
- package/dist/lib/templates.mjs +2 -0
- package/dist/lib/testing.mjs +75 -0
- package/dist/lib/testing.mjs.map +1 -0
- package/dist/lib/translations.mjs +98 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/lib/types.mjs +2 -0
- package/dist/types/src/capabilities/ScriptSurfaces.d.ts +28 -0
- package/dist/types/src/capabilities/ScriptSurfaces.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/compiler.d.ts +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/components/NotebookStack/NotebookStack.d.ts +1 -1
- package/dist/types/src/components/NotebookStack/NotebookStack.d.ts.map +1 -1
- package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -1
- package/dist/types/src/components/QueryEditor/QueryEditor.d.ts.map +1 -1
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts +1 -1
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
- package/dist/types/src/components/TestPanel/TestPanel.d.ts +1 -1
- package/dist/types/src/components/TestPanel/TestPanel.d.ts.map +1 -1
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +1 -1
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +1 -1
- package/dist/types/src/containers/DeploymentDialog/DeploymentDialog.d.ts +5 -2
- package/dist/types/src/containers/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
- package/dist/types/src/containers/NotebookArticle/NotebookArticle.d.ts +4 -1
- package/dist/types/src/containers/NotebookArticle/NotebookArticle.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptArticle/ScriptArticle.d.ts +4 -1
- package/dist/types/src/containers/ScriptArticle/ScriptArticle.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptArticle/ScriptArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptProperties/FunctionBinding.d.ts +4 -1
- package/dist/types/src/containers/ScriptProperties/FunctionBinding.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptProperties/FunctionPublishing.d.ts +4 -1
- package/dist/types/src/containers/ScriptProperties/FunctionPublishing.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptProperties/ScriptProperties.d.ts +4 -1
- package/dist/types/src/containers/ScriptProperties/ScriptProperties.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptProperties/ScriptProperties.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptProperties/SkillEditor.d.ts +4 -1
- package/dist/types/src/containers/ScriptProperties/SkillEditor.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptSettings/ScriptSettings.d.ts +4 -1
- package/dist/types/src/containers/ScriptSettings/ScriptSettings.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptSettings/ScriptSettings.stories.d.ts +4 -1
- package/dist/types/src/containers/ScriptSettings/ScriptSettings.stories.d.ts.map +1 -1
- package/dist/types/src/containers/TestContainer/TestContainer.d.ts +4 -1
- package/dist/types/src/containers/TestContainer/TestContainer.d.ts.map +1 -1
- package/dist/types/src/hooks/deploy.d.ts +2 -35
- package/dist/types/src/hooks/deploy.d.ts.map +1 -1
- package/dist/types/src/hooks/format.d.ts +2 -23
- package/dist/types/src/hooks/format.d.ts.map +1 -1
- package/dist/types/src/hooks/template.d.ts +2 -18
- package/dist/types/src/hooks/template.d.ts.map +1 -1
- package/dist/types/src/hooks/useToolbarState.d.ts +1 -1
- package/dist/types/src/hooks/useToolbarState.d.ts.map +1 -1
- package/dist/types/src/notebook/compute-graph.d.ts +1 -1
- package/dist/types/src/notebook/compute-graph.d.ts.map +1 -1
- package/dist/types/src/skills/functions/deploy.d.ts.map +1 -1
- package/dist/types/src/skills/functions/inspect-invocations.d.ts.map +1 -1
- package/dist/types/src/templates/chess-bot.d.ts +2 -2
- package/dist/types/src/templates/chess-bot.d.ts.map +1 -1
- package/dist/types/src/templates/commentary.d.ts +2 -2
- package/dist/types/src/templates/commentary.d.ts.map +1 -1
- package/dist/types/src/types/ScriptCapabilities.d.ts +1 -1
- package/dist/types/src/types/ScriptCapabilities.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +88 -82
- package/src/capabilities/ScriptSurfaces.tsx +96 -0
- package/src/capabilities/app-graph-builder.ts +2 -2
- package/src/capabilities/compiler.ts +1 -1
- package/src/capabilities/react-surface.ts +82 -0
- package/src/components/NotebookStack/NotebookCell.tsx +9 -2
- package/src/components/NotebookStack/NotebookStack.stories.tsx +2 -0
- package/src/components/NotebookStack/NotebookStack.tsx +22 -14
- package/src/components/QueryEditor/QueryEditor.stories.tsx +1 -1
- package/src/components/QueryEditor/QueryEditor.tsx +1 -0
- package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +1 -1
- package/src/components/ScriptToolbar/ScriptToolbar.tsx +1 -1
- package/src/components/TestPanel/TestPanel.tsx +2 -2
- package/src/components/TypescriptEditor/TypescriptEditor.tsx +1 -1
- package/src/containers/DeploymentDialog/DeploymentDialog.stories.tsx +1 -1
- package/src/containers/DeploymentDialog/DeploymentDialog.tsx +3 -1
- package/src/containers/NotebookArticle/NotebookArticle.stories.tsx +1 -1
- package/src/containers/NotebookArticle/NotebookArticle.tsx +4 -2
- package/src/containers/ScriptArticle/ScriptArticle.stories.tsx +2 -1
- package/src/containers/ScriptArticle/ScriptArticle.tsx +3 -1
- package/src/containers/ScriptProperties/FunctionBinding.tsx +5 -3
- package/src/containers/ScriptProperties/FunctionPublishing.tsx +4 -2
- package/src/containers/ScriptProperties/ScriptProperties.stories.tsx +2 -1
- package/src/containers/ScriptProperties/ScriptProperties.tsx +2 -0
- package/src/containers/ScriptProperties/SkillEditor.tsx +3 -1
- package/src/containers/ScriptSettings/ScriptSettings.tsx +2 -0
- package/src/containers/TestContainer/TestContainer.tsx +4 -2
- package/src/e2e/ai.test.ts +2 -2
- package/src/e2e/deploy.test.ts +2 -2
- package/src/hooks/deploy.ts +13 -4
- package/src/hooks/format.ts +2 -2
- package/src/hooks/template.ts +3 -3
- package/src/hooks/useToolbarState.ts +1 -1
- package/src/notebook/compute-graph.test.ts +1 -1
- package/src/notebook/compute-graph.ts +1 -1
- package/src/skills/functions/deploy.ts +5 -6
- package/src/skills/functions/inspect-invocations.ts +2 -2
- package/src/skills/functions/install-function.ts +1 -1
- package/src/skills/functions/invoke.ts +1 -1
- package/src/skills/functions/query-deployed-functions.ts +1 -1
- package/src/templates/chess-bot.ts +3 -3
- package/src/templates/commentary.ts +3 -3
- package/src/testing/simulator.test.ts +1 -1
- package/src/types/ScriptCapabilities.ts +1 -1
- package/src/util/deploy.ts +3 -3
- package/src/util/functions.ts +2 -2
- package/dist/lib/neutral/DeploymentDialog-7OIIL7LB.mjs +0 -114
- package/dist/lib/neutral/DeploymentDialog-7OIIL7LB.mjs.map +0 -7
- package/dist/lib/neutral/NotebookArticle-AOBB3XGD.mjs +0 -745
- package/dist/lib/neutral/NotebookArticle-AOBB3XGD.mjs.map +0 -7
- package/dist/lib/neutral/ScriptArticle-I3DOJARR.mjs +0 -79
- package/dist/lib/neutral/ScriptArticle-I3DOJARR.mjs.map +0 -7
- package/dist/lib/neutral/ScriptPlugin.mjs +0 -51
- package/dist/lib/neutral/ScriptPlugin.mjs.map +0 -7
- package/dist/lib/neutral/ScriptPlugin.node.mjs +0 -27
- package/dist/lib/neutral/ScriptPlugin.node.mjs.map +0 -7
- package/dist/lib/neutral/ScriptPlugin.workerd.mjs +0 -21
- package/dist/lib/neutral/ScriptPlugin.workerd.mjs.map +0 -7
- package/dist/lib/neutral/ScriptProperties-RHDQGMGT.mjs +0 -296
- package/dist/lib/neutral/ScriptProperties-RHDQGMGT.mjs.map +0 -7
- package/dist/lib/neutral/ScriptSettings-NS3ZY7ZR.mjs +0 -35
- package/dist/lib/neutral/ScriptSettings-NS3ZY7ZR.mjs.map +0 -7
- package/dist/lib/neutral/TestContainer-AFVTBYSJ.mjs +0 -44
- package/dist/lib/neutral/TestContainer-AFVTBYSJ.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-POP3CX6G.mjs +0 -52
- package/dist/lib/neutral/app-graph-builder-POP3CX6G.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/index.mjs +0 -21
- package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/node.mjs +0 -17
- package/dist/lib/neutral/capabilities/node.mjs.map +0 -7
- package/dist/lib/neutral/chunk-2REUEDUA.mjs +0 -56
- package/dist/lib/neutral/chunk-2REUEDUA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-652CIABA.mjs +0 -124
- package/dist/lib/neutral/chunk-652CIABA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-6DOWVKIW.mjs +0 -344
- package/dist/lib/neutral/chunk-6DOWVKIW.mjs.map +0 -7
- package/dist/lib/neutral/chunk-CHNFYLKW.mjs +0 -52
- package/dist/lib/neutral/chunk-CHNFYLKW.mjs.map +0 -7
- package/dist/lib/neutral/chunk-INFWOSTM.mjs +0 -156
- package/dist/lib/neutral/chunk-INFWOSTM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-KSVKXCTX.mjs +0 -8
- package/dist/lib/neutral/chunk-KSVKXCTX.mjs.map +0 -7
- package/dist/lib/neutral/chunk-NVV5UYY4.mjs +0 -50
- package/dist/lib/neutral/chunk-NVV5UYY4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-USJ44FIU.mjs +0 -8
- package/dist/lib/neutral/chunk-USJ44FIU.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WAGQ77UQ.mjs.map +0 -7
- package/dist/lib/neutral/compiler-ODK4UA2N.mjs +0 -101
- package/dist/lib/neutral/compiler-ODK4UA2N.mjs.map +0 -7
- package/dist/lib/neutral/components/index.mjs +0 -695
- package/dist/lib/neutral/components/index.mjs.map +0 -7
- package/dist/lib/neutral/containers/index.mjs +0 -19
- package/dist/lib/neutral/containers/index.mjs.map +0 -7
- package/dist/lib/neutral/create-SGHWWTET.mjs +0 -46
- package/dist/lib/neutral/create-SGHWWTET.mjs.map +0 -7
- package/dist/lib/neutral/create-object-QW66KQWS.mjs +0 -43
- package/dist/lib/neutral/create-object-QW66KQWS.mjs.map +0 -7
- package/dist/lib/neutral/create-script-CIEJOBIU.mjs +0 -45
- package/dist/lib/neutral/create-script-CIEJOBIU.mjs.map +0 -7
- package/dist/lib/neutral/delete-72RXVLVI.mjs +0 -21
- package/dist/lib/neutral/delete-72RXVLVI.mjs.map +0 -7
- package/dist/lib/neutral/deploy-PJTJAQZY.mjs +0 -67
- package/dist/lib/neutral/deploy-PJTJAQZY.mjs.map +0 -7
- package/dist/lib/neutral/hooks/index.mjs +0 -369
- package/dist/lib/neutral/hooks/index.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -41
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/inspect-invocations-ZUXVUAML.mjs +0 -59
- package/dist/lib/neutral/inspect-invocations-ZUXVUAML.mjs.map +0 -7
- package/dist/lib/neutral/install-function-YFDZLVMJ.mjs +0 -49
- package/dist/lib/neutral/install-function-YFDZLVMJ.mjs.map +0 -7
- package/dist/lib/neutral/invoke-CDRBQ2WA.mjs +0 -32
- package/dist/lib/neutral/invoke-CDRBQ2WA.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -10
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/operation-handler-M3B6IRMV.mjs +0 -18
- package/dist/lib/neutral/operation-handler-M3B6IRMV.mjs.map +0 -7
- package/dist/lib/neutral/operations/index.mjs +0 -8
- package/dist/lib/neutral/operations/index.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -16
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/query-deployed-functions-RBQMGON2.mjs +0 -34
- package/dist/lib/neutral/query-deployed-functions-RBQMGON2.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-GEXOZLBC.mjs +0 -120
- package/dist/lib/neutral/react-surface-GEXOZLBC.mjs.map +0 -7
- package/dist/lib/neutral/read-OY3K5R3V.mjs +0 -26
- package/dist/lib/neutral/read-OY3K5R3V.mjs.map +0 -7
- package/dist/lib/neutral/settings-FD7HXEY6.mjs +0 -30
- package/dist/lib/neutral/settings-FD7HXEY6.mjs.map +0 -7
- package/dist/lib/neutral/skill-definition-JZ7UYBT7.mjs +0 -15
- package/dist/lib/neutral/skill-definition-JZ7UYBT7.mjs.map +0 -7
- package/dist/lib/neutral/skills/index.mjs +0 -10
- package/dist/lib/neutral/skills/index.mjs.map +0 -7
- package/dist/lib/neutral/templates/index.mjs +0 -10
- package/dist/lib/neutral/templates/index.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -104
- package/dist/lib/neutral/translations.mjs.map +0 -7
- package/dist/lib/neutral/types/index.mjs +0 -17
- package/dist/lib/neutral/types/index.mjs.map +0 -7
- package/dist/lib/neutral/update-Z5VGOLBN.mjs +0 -44
- package/dist/lib/neutral/update-Z5VGOLBN.mjs.map +0 -7
- package/src/capabilities/react-surface.tsx +0 -132
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.mjs","names":[],"sources":["../../src/components/NotebookStack/NotebookMenu.tsx","../../src/components/TypescriptEditor/TypescriptEditor.tsx","../../src/components/NotebookStack/NotebookCell.tsx","../../src/components/NotebookStack/NotebookStack.tsx","../../src/components/QueryEditor/QueryEditor.tsx","../../src/components/ScriptToolbar/ScriptToolbar.tsx","../../src/components/TestPanel/TestPanel.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { DropdownMenu, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\nimport { type Notebook } from '#types';\n\nexport type NotebookMenuProps = {\n cell?: Notebook.Cell;\n onCellInsert?: (type: Notebook.CellType, after: string | undefined) => void;\n onCellDelete?: (id: string) => void;\n};\n\n// TODO(burdon): Better way to organize menu?\nexport const NotebookMenu = ({ cell, onCellInsert, onCellDelete }: NotebookMenuProps) => {\n const { t } = useTranslation(meta.profile.key);\n return (\n <DropdownMenu.Portal>\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n <DropdownMenu.Item onClick={() => onCellInsert?.('script', cell?.id)}>\n {t('notebook-cell-insert-script.label')}\n </DropdownMenu.Item>\n <DropdownMenu.Item onClick={() => onCellInsert?.('prompt', cell?.id)}>\n {t('notebook-cell-insert-prompt.label')}\n </DropdownMenu.Item>\n <DropdownMenu.Item onClick={() => onCellInsert?.('query', cell?.id)}>\n {t('notebook-cell-insert-query.label')}\n </DropdownMenu.Item>\n <DropdownMenu.Item onClick={() => onCellInsert?.('markdown', cell?.id)}>\n {t('notebook-cell-insert-markdown.label')}\n </DropdownMenu.Item>\n {cell && onCellDelete && (\n <DropdownMenu.Item onClick={() => onCellDelete?.(cell.id)}>\n {t('notebook-cell-delete.label')}\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n );\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { autocompletion, completionKeymap } from '@codemirror/autocomplete';\nimport { javascript } from '@codemirror/lang-javascript';\nimport { HighlightStyle } from '@codemirror/language';\nimport { lintKeymap } from '@codemirror/lint';\nimport { Prec } from '@codemirror/state';\nimport { keymap } from '@codemirror/view';\nimport { tags } from '@lezer/highlight';\nimport { composeRefs } from '@radix-ui/react-compose-refs';\nimport { type VirtualTypeScriptEnvironment } from '@typescript/vfs';\nimport { continueKeymap } from '@valtown/codemirror-continue';\nimport { type HoverInfo, tsAutocomplete, tsFacet, tsHover, tsLinter, tsSync } from '@valtown/codemirror-ts';\nimport React from 'react';\n\nimport { type ThemedClassName, type ThemeMode, useThemeContext } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { type UseTextEditorProps, useTextEditor } from '@dxos/react-ui-editor';\nimport { Domino } from '@dxos/ui';\nimport {\n type BasicExtensionsOptions,\n InputModeExtensions,\n createBasicExtensions,\n createThemeExtensions,\n defaultStyles,\n} from '@dxos/ui-editor';\nimport { type EditorInputMode } from '@dxos/ui-editor/types';\nimport { isNonNullable } from '@dxos/util';\n\nexport type TypescriptEditorProps = ThemedClassName<\n {\n id: string;\n role?: string;\n inputMode?: EditorInputMode;\n toolbar?: boolean;\n env?: VirtualTypeScriptEnvironment;\n options?: BasicExtensionsOptions;\n } & Pick<UseTextEditorProps, 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>\n>;\n\nexport const TypescriptEditor = composable<HTMLDivElement, TypescriptEditorProps>(\n (\n {\n classNames,\n id,\n role = 'article',\n inputMode = 'vscode',\n env,\n options,\n initialValue,\n extensions,\n scrollTo,\n selection,\n ...props\n },\n forwardedRef,\n ) => {\n const { themeMode } = useThemeContext();\n const { parentRef, focusAttributes } = useTextEditor(\n () => ({\n id,\n initialValue,\n selection,\n scrollTo,\n extensions: [\n extensions,\n createThemeExtensions({\n monospace: true,\n themeMode,\n syntaxHighlighting: true,\n }),\n createBasicExtensions({\n highlightActiveLine: true,\n indentWithTab: true,\n lineNumbers: true,\n lineWrapping: false,\n scrollPastEnd: role === 'article',\n search: true,\n ...options,\n }),\n\n InputModeExtensions[inputMode],\n javascript({ typescript: true }),\n autocompletion({ override: env ? [tsAutocomplete()] : undefined }),\n\n // Continues block comments when pressing Enter.\n Prec.high(keymap.of(continueKeymap)),\n keymap.of(completionKeymap),\n keymap.of(lintKeymap),\n\n // https://github.com/val-town/codemirror-ts\n env && [\n // TODO(burdon): Fix type.\n tsFacet.of({ env: env as any, path: `./src/${id}.ts` }),\n tsSync(),\n tsLinter(),\n tsHover({ renderTooltip: createTooltipRenderer(themeMode) }),\n ],\n ].filter(isNonNullable),\n }),\n [themeMode, id, extensions, inputMode, selection, scrollTo, env],\n );\n\n return (\n <div {...composableProps(props, { classNames, ...focusAttributes })} ref={composeRefs(parentRef, forwardedRef)} />\n );\n },\n);\n\n// TODO(burdon): Factor out (react-ui-editor).\nconst createTooltipRenderer = (themeMode: ThemeMode) => {\n const theme = HighlightStyle.define(themeMode === 'dark' ? defaultStyles.dark : defaultStyles.light);\n\n const classFromKind = (_kind: string) => {\n // E.g., localName, methodName, parameterName, etc.\n const kind = _kind.endsWith('Name') ? 'name' : _kind;\n const validTag = kind in tags;\n if (!validTag) {\n return '';\n }\n\n const tag = tags[kind as keyof typeof tags];\n if (typeof tag === 'function') {\n return '';\n }\n\n return theme.style([tag]) ?? '';\n };\n\n return (info: HoverInfo) => {\n const children =\n info.quickInfo?.displayParts?.map(({ kind, text }) =>\n Domino.of('span').classNames(classFromKind(kind)).text(text),\n ) ?? [];\n return {\n dom: Domino.of('div')\n .classNames('xs:max-w-80 max-w-lg p-1 dx-base-surface rounded-sm border border-separator')\n .append(...children).root,\n };\n };\n};\n\nexport default TypescriptEditor;\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type Database, Obj } from '@dxos/echo';\nimport { Doc } from '@dxos/echo-doc';\nimport { invariant } from '@dxos/invariant';\nimport { TemplateEditor } from '@dxos/plugin-routine/components';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { QueryEditor, type QueryEditorProps } from '@dxos/react-ui-components';\nimport { Editor, type EditorViewProps } from '@dxos/react-ui-editor';\nimport {\n type BasicExtensionsOptions,\n createBasicExtensions,\n createDataExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n decorateMarkdown,\n} from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { type Notebook } from '#types';\n\nimport { type ComputeGraph } from '../../notebook';\nimport { TypescriptEditor, type TypescriptEditorProps } from '../TypescriptEditor';\nimport { type NotebookMenuProps } from './NotebookMenu';\n\nconst editorStyles = 'p-2 ps-3';\nconst valueStyles = 'p-1 ps-3';\n\nexport type NotebookCellProps = {\n db?: Database.Database;\n graph?: ComputeGraph;\n dragging?: boolean;\n cell: Notebook.Cell;\n promptResults?: Record<string, string>;\n} & (Pick<NotebookMenuProps, 'onCellInsert' | 'onCellDelete'> & Pick<TypescriptEditorProps, 'env'>);\n\n// TODO(burdon): Show evaluation errors.\nexport const NotebookCell = ({ db, graph, dragging, cell, promptResults, env }: NotebookCellProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n const extensions = useMemo(() => {\n return cell.source?.target\n ? [createDataExtensions({ id: cell.id, text: Doc.createAccessor(cell.source.target, ['content']) })]\n : [];\n }, [cell.source?.target]);\n\n const explorerGraph = cell.graph?.target;\n\n const handleQueryChange = useCallback<NonNullable<QueryEditorProps['onChange']>>(\n (value: string) => {\n invariant(cell.source?.target);\n Obj.update(cell.source.target, (obj) => {\n obj.content = value;\n });\n },\n [cell],\n );\n\n switch (cell.type) {\n case 'markdown':\n if (!cell.source?.target) {\n return null;\n }\n\n return (\n <NotebookTextEditor\n id={cell.id}\n classNames={editorStyles}\n initialValue={cell.source.target.content}\n extensions={extensions}\n />\n );\n\n case 'script':\n if (!cell.source?.target) {\n return null;\n }\n\n return (\n <div className='flex flex-col divide-y divide-subdued-separator'>\n <TypescriptEditor\n id={cell.id}\n role='section'\n classNames={editorStyles}\n initialValue={cell.source.target.content}\n extensions={extensions}\n env={env}\n options={{\n placeholder: t('notebook-cell.placeholder'),\n highlightActiveLine: false,\n lineNumbers: false,\n }}\n />\n <NotebookCellValue cell={cell} graph={graph} />\n </div>\n );\n\n case 'query':\n if (!cell.source?.target) {\n return null;\n }\n\n // TODO(burdon): Remove app-framework deps (via render prop).\n return (\n <div className={mx('h-full overflow-hidden grid', explorerGraph && !dragging && 'grid-rows-[min-content_1fr]')}>\n <QueryEditor\n id={cell.id}\n classNames={editorStyles}\n db={db}\n value={cell.source.target.content}\n onChange={handleQueryChange}\n />\n {explorerGraph && !dragging && (\n <Surface.Surface\n type={AppSurface.Section}\n limit={1}\n data={{ subject: explorerGraph, attendableId: cell.id }}\n />\n )}\n </div>\n );\n\n // TODO(burdon): Use streaming response from Chat.\n case 'prompt':\n if (!cell.prompt?.target) {\n return null;\n }\n\n return (\n <>\n <TemplateEditor id={cell.id} source={cell.prompt.target.text} lineNumbers={false} classNames={editorStyles} />\n <NotebookPromptResult cell={cell} promptResults={promptResults} />\n </>\n );\n\n default:\n return null;\n }\n};\n\nconst NotebookCellValue = ({ cell, graph }: NotebookCellProps) => {\n const name = graph?.getExpressions()[cell.id]?.name;\n const value = graph?.getValue(cell.id);\n if (value == null) {\n return null;\n }\n\n return (\n <div className={mx('flex w-full bg-group-surface text-description font-mono', valueStyles)}>\n {name && (\n <>\n <span className='text-success-text'>{name}</span>\n <span className='text-description'> = </span>\n </>\n )}\n <span>{value}</span>\n </div>\n );\n};\n\nconst NotebookPromptResult = ({ cell, promptResults }: NotebookCellProps) => {\n if (!cell.prompt) {\n return null;\n }\n\n const value = promptResults?.[cell.prompt.uri];\n if (value == null) {\n return null;\n }\n\n return (\n <div className={mx('flex w-full dx-group-surface text-description border-y border-subdued-separator', valueStyles)}>\n <NotebookTextEditor readOnly value={value} />\n </div>\n );\n};\n\nconst NotebookTextEditor = ({\n classNames,\n extensions: extensionsProp,\n readOnly,\n ...props\n}: EditorViewProps & Pick<BasicExtensionsOptions, 'readOnly'>) => {\n const { t } = useTranslation(meta.profile.key);\n const { themeMode } = useThemeContext();\n const extensions = useMemo(() => {\n return [\n createThemeExtensions({ themeMode, syntaxHighlighting: true }),\n createBasicExtensions({ placeholder: t('notebook-markdown.placeholder'), readOnly }),\n createMarkdownExtensions(),\n decorateMarkdown(),\n extensionsProp,\n ].filter(isNonNullable);\n }, [extensionsProp, readOnly, themeMode, t]);\n\n return (\n <Editor.Root>\n {/* Focused-cell affordance: Editor.View no longer applies a focus border by default. */}\n <Editor.View\n {...props}\n classNames={mx('border focus-within:border-focus-ring-subtle', classNames)}\n extensions={extensions}\n selectionEnd\n />\n </Editor.Root>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useId, useMemo, useState } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { DropdownMenu, IconButton, ScrollArea, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { type DndContainerHandler } from '@dxos/react-ui-dnd';\nimport { Mosaic, type MosaicTileProps } from '@dxos/react-ui-mosaic';\nimport { mx } from '@dxos/ui-theme';\nimport { arrayMove } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { type Notebook } from '#types';\n\nimport { type TypescriptEditorProps } from '../TypescriptEditor';\nimport { NotebookCell, type NotebookCellProps } from './NotebookCell';\nimport { NotebookMenu } from './NotebookMenu';\n\nconst minSectionHeight = 'min-h-[16rem]';\n\nconst getCellId = (cell: Notebook.Cell) => cell.id;\n\nexport type NotebookStackProps = ThemedClassName<\n {\n notebook?: Notebook.Notebook;\n } & (Pick<NotebookSectionProps, 'db' | 'graph' | 'promptResults' | 'onCellInsert' | 'onCellDelete'> &\n Pick<TypescriptEditorProps, 'env'>)\n>;\n\nexport const NotebookStack = composable<HTMLDivElement, NotebookStackProps>(\n ({ notebook, db, graph, promptResults, onCellInsert, onCellDelete, env, ...props }, forwardedRef) => {\n const [viewport, setViewport] = useState<HTMLElement | null>(null);\n\n // Stable Tile identity: an inline component is a new type each render, so Mosaic would unmount and\n // remount every cell (losing editor state) whenever this component re-renders.\n const Tile = useCallback(\n (tileProps: MosaicTileProps<Notebook.Cell>) => (\n <NotebookSection\n {...tileProps}\n db={db}\n graph={graph}\n promptResults={promptResults}\n onCellInsert={onCellInsert}\n onCellDelete={onCellDelete}\n env={env}\n />\n ),\n [db, graph, promptResults, onCellInsert, onCellDelete, env],\n );\n\n // Per-instance discriminator so the same notebook opened twice doesn't collide in the Mosaic registry.\n const instanceId = useId();\n\n // Reorder cells in place; placeholder/tile locations are 1-based with half-step placeholders between\n // tiles, so the floor of the drop location is the destination array index (see Mosaic.Stack).\n const eventHandler = useMemo<DndContainerHandler<Notebook.Cell>>(\n () => ({\n id: `notebook:${notebook?.id ?? 'anon'}:${instanceId}`,\n // Only the notebook's own cells are droppable; onDrop only reorders within this notebook.\n canDrop: ({ source }) => !!notebook && notebook.cells.some((cell) => cell.id === source.id),\n onDrop: ({ source, target }) => {\n if (!notebook || !target) {\n return;\n }\n\n const to =\n target.type === 'tile' || target.type === 'placeholder'\n ? target.location\n : target.type === 'container'\n ? notebook.cells.length\n : -1;\n const insertIndex = typeof to === 'number' && to >= 0 ? Math.floor(to) : -1;\n if (insertIndex < 0) {\n return;\n }\n\n Obj.update(notebook, (notebook) => {\n const from = notebook.cells.findIndex((cell) => cell.id === source.id);\n if (from !== -1) {\n arrayMove(notebook.cells, from, insertIndex);\n }\n });\n },\n }),\n [notebook, instanceId],\n );\n\n return (\n <Mosaic.Container\n asChild\n orientation='vertical'\n autoScroll={viewport}\n eventHandler={eventHandler}\n ref={forwardedRef}\n >\n <ScrollArea.Root orientation='vertical' padding {...composableProps(props)}>\n <ScrollArea.Viewport ref={setViewport}>\n <Mosaic.Stack orientation='vertical' items={notebook?.cells ?? []} getId={getCellId} Tile={Tile} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n );\n },\n);\n\ntype NotebookSectionProps = MosaicTileProps<Notebook.Cell> &\n Pick<NotebookCellProps, 'db' | 'graph' | 'promptResults' | 'onCellInsert' | 'onCellDelete' | 'env'>;\n\n// TODO(burdon): Option for narrow rail (with compact buttons that align with first button in toolbar).\n// TODO(burdon): Reinstate a Mosaic-native resize affordance for query cells (currently a fixed min-height).\nconst NotebookSection = ({\n data: cell,\n db,\n env,\n graph,\n promptResults,\n onCellInsert,\n onCellDelete,\n ...tileProps\n}: NotebookSectionProps) => {\n const { t } = useTranslation(meta.profile.key);\n const resizable = cell.type === 'query';\n const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);\n\n return (\n <Mosaic.Tile\n {...tileProps}\n data={cell}\n dragHandle={dragHandle}\n classNames={mx(\n 'grid grid-cols-[min-content_1fr] overflow-visible border border-subdued-separator',\n resizable && minSectionHeight,\n )}\n >\n {/* Side rail */}\n <div className='flex flex-col p-1 border-e border-subdued-separator dx-attention-surface'>\n <IconButton\n ref={setDragHandle}\n variant='ghost'\n icon='ph--dots-six-vertical--regular'\n iconOnly\n label='Drag handle'\n />\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n variant='ghost'\n icon='ph--dots-three--regular'\n iconOnly\n label={t('notebook-cell-insert.label')}\n />\n </DropdownMenu.Trigger>\n <NotebookMenu cell={cell} onCellInsert={onCellInsert} onCellDelete={onCellDelete} />\n </DropdownMenu.Root>\n </div>\n\n <NotebookCell db={db} cell={cell} env={env} graph={graph} promptResults={promptResults} />\n </Mosaic.Tile>\n );\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\nimport { ModuleResolutionKind, ScriptTarget } from 'typescript';\n\n// TODO(burdon): Document.\nimport queryApi from '@dxos/echo-query/api.d.ts?raw';\nimport { useAsyncEffect } from '@dxos/react-ui';\n\nimport { Compiler } from '../../compiler';\nimport { TypescriptEditor, type TypescriptEditorProps } from '../TypescriptEditor';\n\nconst GLOBALS = `\n namespace QueryAPI {\n ${queryApi}\n }\n\n declare global {\n const Query: typeof QueryAPI.Query;\n const Filter: typeof QueryAPI.Filter;\n const Order: typeof QueryAPI.Order;\n }\n\n export {};\n`;\n\nexport type QueryEditorProps = Omit<TypescriptEditorProps, 'env'>;\n\nexport const QueryEditor = (props: QueryEditorProps) => {\n const [compiler, setCompiler] = useState<Compiler>();\n\n useAsyncEffect(async () => {\n const compiler = new Compiler({\n lib: ['ES5'],\n target: ScriptTarget.ES2022,\n // Avoid `@typescript/vfs`'s deprecated `node10` default (rejected by TS 6).\n moduleResolution: ModuleResolutionKind.Bundler,\n });\n await compiler.initialize(GLOBALS);\n setCompiler(compiler);\n }, []);\n\n if (!compiler) {\n return null;\n }\n\n return <TypescriptEditor {...props} env={compiler.environment} />;\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom';\nimport React, { useMemo } from 'react';\n\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type Script } from '@dxos/compute';\nimport { ElevationProvider, useTranslation } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { type ActionGraphProps, Menu, MenuRootProps, createGapSeparator, useMenuActions } from '@dxos/react-ui-menu';\n\nimport {\n type CreateDeployOptions,\n type ScriptToolbarStateStore,\n createDeploy,\n createFormat,\n createTemplateSelect,\n useDeployDeps,\n} from '#hooks';\nimport { meta } from '#meta';\n\nexport type ScriptToolbarProps = Pick<MenuRootProps, 'attendableId'> & {\n script: Script.Script;\n state: ScriptToolbarStateStore;\n};\n\nexport const ScriptToolbar = composable<HTMLDivElement, ScriptToolbarProps>(\n ({ script, attendableId, role, state, ...props }, forwardedRef) => {\n const { t } = useTranslation(meta.profile.key);\n const options = useDeployDeps({ script });\n const menuCreator = useMemo(\n () => createToolbarActions({ state, script, t, ...options }),\n [state, script, options, t],\n );\n const menuActions = useMenuActions(menuCreator);\n\n return (\n <ElevationProvider elevation={role === AppSurface.Section.role ? 'positioned' : 'base'}>\n <Menu.Root {...menuActions} attendableId={attendableId}>\n <Menu.Toolbar {...composableProps(props)} ref={forwardedRef} />\n </Menu.Root>\n </ElevationProvider>\n );\n },\n);\n\nconst createToolbarActions = ({ state, script, ...options }: CreateDeployOptions): Atom.Atom<ActionGraphProps> =>\n Atom.make((get) => {\n // Subscribe to state changes.\n get(state.atom);\n const templateSelect = createTemplateSelect(script);\n const format = createFormat(script);\n const gap = createGapSeparator();\n const deploy = createDeploy({ state, script, ...options });\n return {\n nodes: [...templateSelect.nodes, ...format.nodes, ...gap.nodes, ...deploy.nodes],\n edges: [...templateSelect.edges, ...format.edges, ...gap.edges, ...deploy.edges],\n };\n });\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { Avatar, Icon, Input, ScrollArea, type ThemedClassName, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\ntype State = 'pending';\n\n/**\n * Request or response.\n */\ntype Message = {\n type: 'request' | 'response';\n text?: string;\n data?: any;\n error?: Error;\n};\n\nexport type TestPanelProps = ThemedClassName<{\n onInvoke?: (input: unknown) => Promise<unknown>;\n}>;\n\n// TODO(burdon): Need persistent history (currently lost when switching tabs).\nexport const TestPanel = composable<HTMLDivElement, TestPanelProps>(\n ({ classNames, onInvoke, ...props }, forwardedRef) => {\n const { t } = useTranslation(meta.profile.key);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [input, setInput] = useState('');\n const [state, setState] = useState<State | null>(null);\n\n // TODO(burdon): Persistent history (thread).\n const [history, setHistory] = useState<Message[]>([]);\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n const handleScroll = () => {\n if (scrollerRef.current) {\n scrollerRef.current.scrollTop = scrollerRef.current.scrollHeight;\n }\n };\n\n const handleClear = () => {\n setInput('');\n setHistory([]);\n inputRef.current?.focus();\n };\n\n const handleResponse = ({\n text,\n data,\n error,\n }: {\n text?: string;\n data?: any;\n error?: Error;\n } = {}) => {\n setHistory((history) => [...history, { type: 'response', text, data, error } satisfies Message]);\n setState(null);\n handleScroll();\n };\n\n const handleRequest = async (input: string) => {\n if (!onInvoke) {\n handleResponse({ error: new Error('Function not deployed') });\n return;\n }\n\n let data: unknown = input;\n let displayText = input;\n if (input.charAt(0) === '{') {\n try {\n const validJsonString = input.replace(/'/g, '\"').replace(/([{,]\\s*)([a-zA-Z0-9_]+)(\\s*:)/g, '$1\"$2\"$3');\n data = JSON.parse(validJsonString);\n displayText = JSON.stringify(data, null, 2);\n } catch (err) {\n handleResponse({ error: new Error('Invalid JSON input') });\n return;\n }\n }\n\n try {\n setState('pending');\n setInput('');\n setHistory((history) => [...history, { type: 'request', text: displayText }]);\n setTimeout(handleScroll);\n\n const result = await onInvoke(data);\n\n if (typeof result === 'string') {\n handleResponse({ text: result });\n } else {\n handleResponse({ data: result });\n }\n } catch (err: any) {\n const error = err instanceof Error ? err : new Error(String(err));\n handleResponse({ error });\n log.catch(err);\n }\n };\n\n return (\n <div\n {...composableProps(props, { classNames: ['flex flex-col h-full overflow-hidden', classNames] })}\n ref={forwardedRef}\n >\n {/* TODO(burdon): Replace with Thread. */}\n <MessageThread ref={scrollerRef} state={state} history={history} />\n {/* TODO(burdon): Replace with Form based on the function's input schema. */}\n <Toolbar.Root>\n <Input.Root>\n <Input.TextInput\n ref={inputRef}\n autoFocus\n placeholder={t('function-request.placeholder')}\n value={input}\n onChange={(ev) => setInput(ev.target.value)}\n onKeyDown={(ev) => ev.key === 'Enter' && handleRequest(input)}\n />\n </Input.Root>\n <Toolbar.IconButton icon='ph--play--regular' label='Execute' iconOnly onClick={() => handleRequest(input)} />\n <Toolbar.IconButton icon='ph--trash--regular' label='Clear' iconOnly onClick={handleClear} />\n </Toolbar.Root>\n </div>\n );\n },\n);\n\n// TODO(burdon): Replace with thread?\n// TODO(burdon): Button to edit/re-run question.\ntype MessageThreadProps = {\n state: State | null;\n history: Message[];\n};\n\nconst MessageThread = forwardRef<HTMLDivElement, MessageThreadProps>(\n ({ state, history }: MessageThreadProps, forwardedRef) => {\n return (\n <ScrollArea.Root orientation='vertical' classNames='h-full' ref={forwardedRef}>\n <ScrollArea.Viewport classNames='gap-6 p-2'>\n {history.map((message, i) => (\n <div key={i} className='grid grid-cols-[var(--dx-rail-item)_1fr_var(--dx-rail-item)]'>\n <div className='p-1'>{message.type === 'response' && <RobotAvatar />}</div>\n <div className='overflow-auto'>\n <MessageItem message={message} />\n </div>\n </div>\n ))}\n\n {state === 'pending' && (\n <div className='grid grid-cols-[var(--dx-rail-item)_1fr_var(--dx-rail-item)]'>\n <div className='p-1'>\n <Icon icon='ph--spinner--regular' size={6} classNames='animate-spin' />\n </div>\n </div>\n )}\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n },\n);\n\nconst MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {\n const { type, text, data, error } = message;\n const wrapper = 'p-1 px-2 rounded-md bg-hover-surface overflow-auto';\n return (\n <div className={mx('flex', type === 'request' ? 'ml-[1rem] justify-end' : 'mr-[1rem]', classNames)}>\n {error && <div className={mx(wrapper, 'whitespace-pre text-error-text')}>{String(error)}</div>}\n\n {text !== undefined && (\n <div className={mx(wrapper, type === 'request' && 'bg-primary-500 dark:bg-primary-600')}>\n {text || '\\u00D8'}\n </div>\n )}\n\n {data && <JsonHighlighter data={data} classNames={mx(wrapper, 'text-xs')} />}\n </div>\n );\n};\n\nconst RobotAvatar = () => (\n <Avatar.Root>\n <Avatar.Content size={6} variant='circle' icon='ph--drone--regular' />\n </Avatar.Root>\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { lazy } from "react";
|
|
2
|
+
//#region src/containers/index.ts
|
|
3
|
+
var DeploymentDialog = lazy(() => import("./chunk-DeploymentDialog.mjs"));
|
|
4
|
+
var NotebookArticle = lazy(() => import("./chunk-NotebookArticle.mjs"));
|
|
5
|
+
var ScriptArticle = lazy(() => import("./chunk-ScriptArticle.mjs"));
|
|
6
|
+
var ScriptProperties = lazy(() => import("./chunk-ScriptProperties.mjs"));
|
|
7
|
+
var ScriptSettings = lazy(() => import("./chunk-ScriptSettings.mjs"));
|
|
8
|
+
var TestContainer = lazy(() => import("./chunk-TestContainer.mjs"));
|
|
9
|
+
//#endregion
|
|
10
|
+
export { DeploymentDialog, NotebookArticle, ScriptArticle, ScriptProperties, ScriptSettings, TestContainer };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=containers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containers.mjs","names":[],"sources":["../../src/containers/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const DeploymentDialog: ComponentType<any> = lazy(() => import('./DeploymentDialog'));\nexport const NotebookArticle: ComponentType<any> = lazy(() => import('./NotebookArticle'));\nexport const ScriptArticle: ComponentType<any> = lazy(() => import('./ScriptArticle'));\nexport const ScriptProperties: ComponentType<any> = lazy(() => import('./ScriptProperties'));\nexport const ScriptSettings: ComponentType<any> = lazy(() => import('./ScriptSettings'));\nexport const TestContainer: ComponentType<any> = lazy(() => import('./TestContainer'));\n"],"mappings":";;AAMA,IAAa,mBAAuC,WAAW,OAAO,+BAAqB;AAC3F,IAAa,kBAAsC,WAAW,OAAO,8BAAoB;AACzF,IAAa,gBAAoC,WAAW,OAAO,4BAAkB;AACrF,IAAa,mBAAuC,WAAW,OAAO,+BAAqB;AAC3F,IAAa,iBAAqC,WAAW,OAAO,6BAAmB;AACvF,IAAa,gBAAoC,WAAW,OAAO,4BAAkB"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { t as templates } from "./chunk-templates.mjs";
|
|
2
|
+
import { a as isScriptDeployed, i as deployScript, n as getFunctionUrl } from "./chunk-util.mjs";
|
|
3
|
+
import { Operation, Script } from "@dxos/compute";
|
|
4
|
+
import { Obj, Query, Ref } from "@dxos/echo";
|
|
5
|
+
import { Capabilities } from "@dxos/app-framework";
|
|
6
|
+
import { meta } from "#meta";
|
|
7
|
+
import { FUNCTIONS_PRESET_META_KEY, getUserFunctionIdInMetadata } from "@dxos/compute-runtime";
|
|
8
|
+
import { log } from "@dxos/log";
|
|
9
|
+
import { ScriptCapabilities, ScriptEvents, ScriptOperation } from "#types";
|
|
10
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
11
|
+
import { useAsyncEffect } from "@dxos/react-ui";
|
|
12
|
+
import { messageValence } from "@dxos/ui-theme";
|
|
13
|
+
import { useCapabilities, useCapability, useOperationInvoker, usePluginManager } from "@dxos/app-framework/ui";
|
|
14
|
+
import { invariant } from "@dxos/invariant";
|
|
15
|
+
import { Atom } from "@effect-atom/atom";
|
|
16
|
+
import { createMenuAction } from "@dxos/react-ui-menu";
|
|
17
|
+
import { useQuery } from "@dxos/echo-react";
|
|
18
|
+
import { useClient } from "@dxos/react-client";
|
|
19
|
+
import { getSpace } from "@dxos/react-client/echo";
|
|
20
|
+
import { format } from "prettier";
|
|
21
|
+
import prettierPluginEstree from "prettier/plugins/estree";
|
|
22
|
+
import prettierPluginTypescript from "prettier/plugins/typescript";
|
|
23
|
+
import { SpaceOperation } from "@dxos/plugin-space";
|
|
24
|
+
import { EffectEx } from "@dxos/effect";
|
|
25
|
+
//#region src/hooks/deploy.ts
|
|
26
|
+
var __dxlog_file$2 = "/__w/dxos/dxos/packages/plugins/plugin-script/src/hooks/deploy.ts";
|
|
27
|
+
var createDeploy = ({ state, script, space, fn, client, existingFunctionId, t }) => {
|
|
28
|
+
const { value } = state;
|
|
29
|
+
return {
|
|
30
|
+
nodes: [
|
|
31
|
+
createMenuAction("error", () => {}, {
|
|
32
|
+
label: value.error ?? ["no-error.label", { ns: meta.profile.key }],
|
|
33
|
+
icon: "ph--warning-circle--regular",
|
|
34
|
+
hidden: !value.error,
|
|
35
|
+
classNames: value.error && messageValence("error")
|
|
36
|
+
}),
|
|
37
|
+
createMenuAction("deploy", async () => {
|
|
38
|
+
if (!script.source || !space) return;
|
|
39
|
+
state.set("error", void 0);
|
|
40
|
+
state.set("deploying", true);
|
|
41
|
+
const result = await deployScript({
|
|
42
|
+
script,
|
|
43
|
+
client,
|
|
44
|
+
space,
|
|
45
|
+
fn,
|
|
46
|
+
existingFunctionId
|
|
47
|
+
});
|
|
48
|
+
if (!result.success) {
|
|
49
|
+
log.catch(result.error, void 0, {
|
|
50
|
+
"~LogMeta": "~LogMeta",
|
|
51
|
+
F: __dxlog_file$2,
|
|
52
|
+
L: 75,
|
|
53
|
+
S: void 0
|
|
54
|
+
});
|
|
55
|
+
state.set("error", t("upload-failed.label"));
|
|
56
|
+
}
|
|
57
|
+
state.set("deploying", false);
|
|
58
|
+
}, {
|
|
59
|
+
type: "deploy",
|
|
60
|
+
label: [value.deploying ? "publishing.label" : "deploy.label", { ns: meta.profile.key }],
|
|
61
|
+
icon: value.deploying ? "ph--spinner-gap--regular" : "ph--cloud-arrow-up--regular",
|
|
62
|
+
disabled: value.deploying,
|
|
63
|
+
classNames: value.deploying ? "[&_svg]:animate-spin" : ""
|
|
64
|
+
}),
|
|
65
|
+
createMenuAction("copy", async () => {
|
|
66
|
+
if (value.functionUrl) await navigator.clipboard.writeText(value.functionUrl);
|
|
67
|
+
}, {
|
|
68
|
+
type: "copy",
|
|
69
|
+
label: ["copy-link.label", { ns: meta.profile.key }],
|
|
70
|
+
icon: "ph--link--regular",
|
|
71
|
+
disabled: !value.functionUrl
|
|
72
|
+
})
|
|
73
|
+
],
|
|
74
|
+
edges: [
|
|
75
|
+
{
|
|
76
|
+
source: "root",
|
|
77
|
+
target: "error",
|
|
78
|
+
relation: "child"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
source: "root",
|
|
82
|
+
target: "deploy",
|
|
83
|
+
relation: "child"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
source: "root",
|
|
87
|
+
target: "copy",
|
|
88
|
+
relation: "child"
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
var useDeployState = ({ state, script }) => {
|
|
94
|
+
const { space, client, fn, existingFunctionId } = useDeployDeps({ script });
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
if (!existingFunctionId) return;
|
|
97
|
+
state.set("functionUrl", getFunctionUrl({
|
|
98
|
+
script,
|
|
99
|
+
fn,
|
|
100
|
+
edgeUrl: client.config.values.runtime?.services?.edge?.url ?? ""
|
|
101
|
+
}));
|
|
102
|
+
}, [
|
|
103
|
+
existingFunctionId,
|
|
104
|
+
space,
|
|
105
|
+
fn,
|
|
106
|
+
script,
|
|
107
|
+
client.config.values.runtime?.services?.edge?.url,
|
|
108
|
+
state
|
|
109
|
+
]);
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
state.set("deployed", isScriptDeployed({
|
|
112
|
+
script,
|
|
113
|
+
fn
|
|
114
|
+
}));
|
|
115
|
+
}, [
|
|
116
|
+
script.changed,
|
|
117
|
+
existingFunctionId,
|
|
118
|
+
fn,
|
|
119
|
+
script,
|
|
120
|
+
state
|
|
121
|
+
]);
|
|
122
|
+
};
|
|
123
|
+
var useDeployDeps = ({ script }) => {
|
|
124
|
+
const client = useClient();
|
|
125
|
+
const space = getSpace(script);
|
|
126
|
+
const [fn] = useQuery(space?.db, Query.type(Operation.PersistentOperation, { source: Ref.make(script) }));
|
|
127
|
+
return {
|
|
128
|
+
client,
|
|
129
|
+
space,
|
|
130
|
+
fn,
|
|
131
|
+
existingFunctionId: useMemo(() => fn && getUserFunctionIdInMetadata(Obj.getMeta(fn)), [fn])
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
//#endregion
|
|
135
|
+
//#region src/hooks/format.ts
|
|
136
|
+
var __dxlog_file$1 = "/__w/dxos/dxos/packages/plugins/plugin-script/src/hooks/format.ts";
|
|
137
|
+
var createFormat = (script) => {
|
|
138
|
+
return {
|
|
139
|
+
nodes: [createMenuAction("format", async () => {
|
|
140
|
+
if (!script.source) return;
|
|
141
|
+
try {
|
|
142
|
+
const formatted = await format(script.source.target.content, {
|
|
143
|
+
parser: "typescript",
|
|
144
|
+
plugins: [prettierPluginEstree, prettierPluginTypescript],
|
|
145
|
+
semi: true,
|
|
146
|
+
singleQuote: true
|
|
147
|
+
});
|
|
148
|
+
Obj.update(script.source.target, (obj) => {
|
|
149
|
+
obj.content = formatted;
|
|
150
|
+
});
|
|
151
|
+
} catch (err) {
|
|
152
|
+
log.catch(err, void 0, {
|
|
153
|
+
"~LogMeta": "~LogMeta",
|
|
154
|
+
F: __dxlog_file$1,
|
|
155
|
+
L: 38,
|
|
156
|
+
S: void 0
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}, {
|
|
160
|
+
label: ["format.label", { ns: meta.profile.key }],
|
|
161
|
+
icon: "ph--magic-wand--regular"
|
|
162
|
+
})],
|
|
163
|
+
edges: [{
|
|
164
|
+
source: "root",
|
|
165
|
+
target: "format",
|
|
166
|
+
relation: "child"
|
|
167
|
+
}]
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
//#endregion
|
|
171
|
+
//#region src/hooks/template.ts
|
|
172
|
+
var createTemplateSelectActions = (script) => {
|
|
173
|
+
return templates.map((template) => {
|
|
174
|
+
return createMenuAction(`template--${template.id}`, () => {
|
|
175
|
+
Obj.update(script, (script) => {
|
|
176
|
+
script.name = template.name;
|
|
177
|
+
const meta = Obj.getMeta(script);
|
|
178
|
+
const oldPresetIndex = meta.keys.findIndex((key) => key.source === FUNCTIONS_PRESET_META_KEY);
|
|
179
|
+
if (oldPresetIndex >= 0) meta.keys.splice(oldPresetIndex, 1);
|
|
180
|
+
if ("presetId" in template) meta.keys.push({
|
|
181
|
+
source: FUNCTIONS_PRESET_META_KEY,
|
|
182
|
+
id: template.presetId
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
if (script.source?.target) Obj.update(script.source.target, (obj) => {
|
|
186
|
+
obj.content = template.source;
|
|
187
|
+
});
|
|
188
|
+
}, {
|
|
189
|
+
label: template.name,
|
|
190
|
+
value: template.id,
|
|
191
|
+
type: "template"
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
var createTemplateSelect = (script) => {
|
|
196
|
+
const templateSelectActions = createTemplateSelectActions(script);
|
|
197
|
+
return {
|
|
198
|
+
nodes: [...templateSelectActions],
|
|
199
|
+
edges: [{
|
|
200
|
+
source: "root",
|
|
201
|
+
target: "template-select",
|
|
202
|
+
relation: "child"
|
|
203
|
+
}, ...templateSelectActions.map((action) => ({
|
|
204
|
+
source: "template-select",
|
|
205
|
+
target: action.id,
|
|
206
|
+
relation: "child"
|
|
207
|
+
}))]
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
//#endregion
|
|
211
|
+
//#region src/hooks/useCreateAndDeployScriptTemplates.ts
|
|
212
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-script/src/hooks/useCreateAndDeployScriptTemplates.ts";
|
|
213
|
+
/**
|
|
214
|
+
* Hook for creating and deploying multiple script templates concurrently.
|
|
215
|
+
*
|
|
216
|
+
* Takes a space and an array of script template IDs, then provides a callback
|
|
217
|
+
* function that creates each script from its template and deploys it to the space.
|
|
218
|
+
* All creation / deployment operations run concurrently for improved performance.
|
|
219
|
+
*/
|
|
220
|
+
var useCreateAndDeployScriptTemplates = (space, scriptTemplates) => {
|
|
221
|
+
const { invokePromise } = useOperationInvoker();
|
|
222
|
+
const client = useClient();
|
|
223
|
+
const [status, setStatus] = useState("idle");
|
|
224
|
+
const [error, setError] = useState(void 0);
|
|
225
|
+
return {
|
|
226
|
+
handleCreateAndDeployScripts: useCallback(async () => {
|
|
227
|
+
invariant(space, void 0, {
|
|
228
|
+
"~LogMeta": "~LogMeta",
|
|
229
|
+
F: __dxlog_file,
|
|
230
|
+
L: 36,
|
|
231
|
+
S: void 0,
|
|
232
|
+
A: ["space", ""]
|
|
233
|
+
});
|
|
234
|
+
setStatus("pending");
|
|
235
|
+
setError(void 0);
|
|
236
|
+
const hasErrors = (await Promise.all(scriptTemplates.map(async (template) => {
|
|
237
|
+
const createResult = await invokePromise(ScriptOperation.CreateScript, {
|
|
238
|
+
db: space.db,
|
|
239
|
+
initialTemplateId: template.id
|
|
240
|
+
});
|
|
241
|
+
invariant(Obj.instanceOf(Script.Script, createResult.data?.object), void 0, {
|
|
242
|
+
"~LogMeta": "~LogMeta",
|
|
243
|
+
F: __dxlog_file,
|
|
244
|
+
L: 46,
|
|
245
|
+
S: void 0,
|
|
246
|
+
A: ["Obj.instanceOf(Script.Script, createResult.data?.object)", ""]
|
|
247
|
+
});
|
|
248
|
+
await invokePromise(SpaceOperation.AddObject, {
|
|
249
|
+
target: space.db,
|
|
250
|
+
object: createResult.data.object
|
|
251
|
+
});
|
|
252
|
+
return deployScript({
|
|
253
|
+
space,
|
|
254
|
+
client,
|
|
255
|
+
script: createResult.data.object
|
|
256
|
+
});
|
|
257
|
+
}))).some((result) => !result.success);
|
|
258
|
+
setStatus(hasErrors ? "error" : "success");
|
|
259
|
+
}, [
|
|
260
|
+
space,
|
|
261
|
+
invokePromise,
|
|
262
|
+
client,
|
|
263
|
+
scriptTemplates
|
|
264
|
+
]),
|
|
265
|
+
status,
|
|
266
|
+
error
|
|
267
|
+
};
|
|
268
|
+
};
|
|
269
|
+
//#endregion
|
|
270
|
+
//#region src/hooks/useToolbarState.ts
|
|
271
|
+
var useToolbarState = (initialState = {}) => {
|
|
272
|
+
const registry = useCapability(Capabilities.AtomRegistry);
|
|
273
|
+
const atom = useMemo(() => Atom.make(initialState), []);
|
|
274
|
+
return useMemo(() => ({
|
|
275
|
+
atom,
|
|
276
|
+
get value() {
|
|
277
|
+
return registry.get(atom);
|
|
278
|
+
},
|
|
279
|
+
update: (updater) => {
|
|
280
|
+
registry.set(atom, updater(registry.get(atom)));
|
|
281
|
+
},
|
|
282
|
+
set: (key, v) => {
|
|
283
|
+
registry.set(atom, {
|
|
284
|
+
...registry.get(atom),
|
|
285
|
+
[key]: v
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}), [atom, registry]);
|
|
289
|
+
};
|
|
290
|
+
//#endregion
|
|
291
|
+
//#region src/hooks/useCompiler.ts
|
|
292
|
+
/**
|
|
293
|
+
* Asynchronously sets up the compiler and returns it.
|
|
294
|
+
* @returns The compiler instance or undefined if it is not ready.
|
|
295
|
+
*/
|
|
296
|
+
var useCompiler = () => {
|
|
297
|
+
const manager = usePluginManager();
|
|
298
|
+
useAsyncEffect(async () => {
|
|
299
|
+
await manager.activate(ScriptEvents.SetupCompiler).pipe(EffectEx.runAndForwardErrors);
|
|
300
|
+
}, [manager]);
|
|
301
|
+
const [compiler] = useCapabilities(ScriptCapabilities.Compiler);
|
|
302
|
+
return compiler;
|
|
303
|
+
};
|
|
304
|
+
//#endregion
|
|
305
|
+
export { createDeploy, createFormat, createTemplateSelect, useCompiler, useCreateAndDeployScriptTemplates, useDeployDeps, useDeployState, useToolbarState };
|
|
306
|
+
|
|
307
|
+
//# sourceMappingURL=hooks.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.mjs","names":[],"sources":["../../src/hooks/deploy.ts","../../src/hooks/format.ts","../../src/hooks/template.ts","../../src/hooks/useCreateAndDeployScriptTemplates.ts","../../src/hooks/useToolbarState.ts","../../src/hooks/useCompiler.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { Operation, Script } from '@dxos/compute';\nimport { getUserFunctionIdInMetadata } from '@dxos/compute-runtime';\nimport { Obj, Query, Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { log } from '@dxos/log';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { type Space, getSpace } from '@dxos/react-client/echo';\nimport { type TFunction } from '@dxos/react-ui';\nimport { type ActionGraphProps, createMenuAction } from '@dxos/react-ui-menu';\nimport { messageValence } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { deployScript, getFunctionUrl, isScriptDeployed } from '../util';\n\nexport type DeployActionProperties = { type: 'deploy' } | { type: 'copy' };\n\nexport type DeployState = {\n deploying: boolean;\n deployed: boolean;\n functionUrl: string;\n error: string;\n};\n\nimport { type ScriptToolbarStateStore } from './useToolbarState';\n\nexport type CreateDeployOptions = {\n state: ScriptToolbarStateStore;\n script: Script.Script;\n fn: Operation.PersistentOperation;\n space?: Space;\n existingFunctionId?: string;\n client: Client;\n t: TFunction;\n};\n\nexport const createDeploy = ({\n state,\n script,\n space,\n fn,\n client,\n existingFunctionId,\n t,\n}: CreateDeployOptions): ActionGraphProps => {\n const { value } = state;\n\n // TODO(wittjosiah): Should this be an action?\n const errorItem = createMenuAction('error', () => {}, {\n label: value.error ?? ['no-error.label', { ns: meta.profile.key }],\n icon: 'ph--warning-circle--regular',\n hidden: !value.error,\n classNames: value.error && messageValence('error'),\n });\n\n const deployAction = createMenuAction<DeployActionProperties>(\n 'deploy',\n async () => {\n if (!script.source || !space) {\n return;\n }\n\n state.set('error', undefined);\n state.set('deploying', true);\n\n const result = await deployScript({ script, client, space, fn, existingFunctionId });\n\n if (!result.success) {\n log.catch(result.error);\n state.set('error', t('upload-failed.label'));\n }\n\n state.set('deploying', false);\n },\n {\n type: 'deploy',\n label: [value.deploying ? 'publishing.label' : 'deploy.label', { ns: meta.profile.key }],\n icon: value.deploying ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular',\n disabled: value.deploying,\n classNames: value.deploying ? '[&_svg]:animate-spin' : '',\n },\n );\n\n const copyAction = createMenuAction<DeployActionProperties>(\n 'copy',\n async () => {\n if (value.functionUrl) {\n await navigator.clipboard.writeText(value.functionUrl);\n }\n },\n {\n type: 'copy',\n label: ['copy-link.label', { ns: meta.profile.key }],\n icon: 'ph--link--regular',\n disabled: !value.functionUrl,\n },\n );\n\n return {\n nodes: [errorItem, deployAction, copyAction],\n edges: [\n { source: 'root', target: 'error', relation: 'child' },\n { source: 'root', target: 'deploy', relation: 'child' },\n { source: 'root', target: 'copy', relation: 'child' },\n ],\n };\n};\n\nexport const useDeployState = ({ state, script }: { state: ScriptToolbarStateStore; script: Script.Script }) => {\n const { space, client, fn, existingFunctionId } = useDeployDeps({ script });\n useEffect(() => {\n if (!existingFunctionId) {\n return;\n }\n\n state.set(\n 'functionUrl',\n getFunctionUrl({\n script,\n fn,\n edgeUrl: client.config.values.runtime?.services?.edge?.url ?? '',\n }),\n );\n }, [existingFunctionId, space, fn, script, client.config.values.runtime?.services?.edge?.url, state]);\n\n useEffect(() => {\n state.set('deployed', isScriptDeployed({ script, fn }));\n }, [script.changed, existingFunctionId, fn, script, state]);\n};\n\nexport const useDeployDeps = ({ script }: { script: Script.Script }) => {\n const client = useClient();\n const space = getSpace(script);\n const [fn] = useQuery(space?.db, Query.type(Operation.PersistentOperation, { source: Ref.make(script) }));\n const existingFunctionId = useMemo(() => fn && getUserFunctionIdInMetadata(Obj.getMeta(fn)), [fn]);\n return { client, space, fn, existingFunctionId };\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';\n\nimport { type Script } from '@dxos/compute';\nimport { Obj } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { type ActionGraphProps, createMenuAction } from '@dxos/react-ui-menu';\n\nimport { meta } from '#meta';\n\nexport type FormatActionProperties = { type: 'format' };\n\nexport const createFormat = (script: Script.Script): ActionGraphProps => {\n const formatAction = createMenuAction(\n 'format',\n async () => {\n if (!script.source) {\n return;\n }\n\n try {\n const formatted = await format(script.source.target!.content, {\n parser: 'typescript',\n plugins: [prettierPluginEstree, prettierPluginTypescript],\n semi: true,\n singleQuote: true,\n });\n Obj.update(script.source.target!, (obj) => {\n obj.content = formatted;\n });\n } catch (err: any) {\n // TODO(wittjosiah): Show error in UI.\n log.catch(err);\n }\n },\n {\n label: ['format.label', { ns: meta.profile.key }],\n icon: 'ph--magic-wand--regular',\n },\n );\n\n return {\n nodes: [formatAction],\n edges: [\n {\n source: 'root',\n target: 'format',\n relation: 'child',\n },\n ],\n };\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { Script } from '@dxos/compute';\nimport { FUNCTIONS_PRESET_META_KEY } from '@dxos/compute-runtime';\nimport { Obj } from '@dxos/echo';\nimport { type ActionGraphProps, createMenuAction } from '@dxos/react-ui-menu';\n\nimport { templates } from '../templates';\n\nexport type TemplateActionProperties = { type: 'template'; value: string };\n\nconst createTemplateSelectActions = (script: Script.Script) => {\n return templates.map((template) => {\n return createMenuAction<TemplateActionProperties>(\n `template--${template.id}`,\n () => {\n Obj.update(script, (script) => {\n script.name = template.name;\n const meta = Obj.getMeta(script);\n const oldPresetIndex = meta.keys.findIndex((key) => key.source === FUNCTIONS_PRESET_META_KEY);\n if (oldPresetIndex >= 0) {\n meta.keys.splice(oldPresetIndex, 1);\n }\n if ('presetId' in template) {\n meta.keys.push({ source: FUNCTIONS_PRESET_META_KEY, id: template.presetId });\n }\n });\n if (script.source?.target) {\n Obj.update(script.source.target, (obj) => {\n obj.content = template.source;\n });\n }\n },\n {\n label: template.name,\n value: template.id,\n type: 'template',\n },\n );\n });\n};\n\nexport const createTemplateSelect = (script: Script.Script): ActionGraphProps => {\n const templateSelectActions = createTemplateSelectActions(script);\n return {\n nodes: [...templateSelectActions],\n edges: [\n { source: 'root', target: 'template-select', relation: 'child' },\n ...templateSelectActions.map((action) => ({ source: 'template-select', target: action.id, relation: 'child' })),\n ],\n };\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback, useState } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { Script } from '@dxos/compute';\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { useClient } from '@dxos/react-client';\nimport { type Space } from '@dxos/react-client/echo';\n\nimport { ScriptOperation } from '#types';\n\nimport { type Template } from '../templates';\nimport { deployScript } from '../util';\n\ntype DeploymentStatus = 'idle' | 'pending' | 'success' | 'error';\n\n/**\n * Hook for creating and deploying multiple script templates concurrently.\n *\n * Takes a space and an array of script template IDs, then provides a callback\n * function that creates each script from its template and deploys it to the space.\n * All creation / deployment operations run concurrently for improved performance.\n */\nexport const useCreateAndDeployScriptTemplates = (space: Space | undefined, scriptTemplates: Template[]) => {\n const { invokePromise } = useOperationInvoker();\n const client = useClient();\n const [status, setStatus] = useState<DeploymentStatus>('idle');\n const [error, setError] = useState<Error | undefined>(undefined);\n\n const handleCreateAndDeployScripts = useCallback(async () => {\n invariant(space);\n setStatus('pending');\n setError(undefined);\n\n const deploymentResults = await Promise.all(\n scriptTemplates.map(async (template) => {\n const createResult = await invokePromise(ScriptOperation.CreateScript, {\n db: space.db,\n initialTemplateId: template.id as any,\n });\n invariant(Obj.instanceOf(Script.Script, createResult.data?.object));\n await invokePromise(SpaceOperation.AddObject, { target: space.db, object: createResult.data.object });\n\n return deployScript({ space, client, script: createResult.data.object });\n }),\n );\n\n const hasErrors = deploymentResults.some((result) => !result.success);\n setStatus(hasErrors ? 'error' : 'success');\n }, [space, invokePromise, client, scriptTemplates]);\n\n // TODO(burdon): Return onCreateAndDeployScripts.\n return { handleCreateAndDeployScripts, status, error };\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom';\nimport { useMemo } from 'react';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { useCapability } from '@dxos/app-framework/ui';\n\nimport { type DeployState } from './deploy';\n\nexport type ScriptToolbarState = Partial<DeployState>;\n\nexport type ScriptToolbarStateStore = {\n atom: Atom.Writable<ScriptToolbarState>;\n get value(): ScriptToolbarState;\n update: (updater: (current: ScriptToolbarState) => ScriptToolbarState) => void;\n set: <K extends keyof ScriptToolbarState>(key: K, value: ScriptToolbarState[K]) => void;\n};\n\nexport const useToolbarState = (initialState: ScriptToolbarState = {}): ScriptToolbarStateStore => {\n const registry = useCapability(Capabilities.AtomRegistry);\n const atom = useMemo(() => Atom.make<ScriptToolbarState>(initialState), []);\n\n return useMemo(\n () => ({\n atom,\n get value() {\n return registry.get(atom);\n },\n update: (updater: (current: ScriptToolbarState) => ScriptToolbarState) => {\n registry.set(atom, updater(registry.get(atom)));\n },\n set: <K extends keyof ScriptToolbarState>(key: K, v: ScriptToolbarState[K]) => {\n registry.set(atom, { ...registry.get(atom), [key]: v });\n },\n }),\n [atom, registry],\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCapabilities, usePluginManager } from '@dxos/app-framework/ui';\nimport { EffectEx } from '@dxos/effect';\nimport { useAsyncEffect } from '@dxos/react-ui';\n\nimport { ScriptEvents } from '#types';\nimport { ScriptCapabilities } from '#types';\n\nimport type { Compiler } from '../compiler';\n\n/**\n * Asynchronously sets up the compiler and returns it.\n * @returns The compiler instance or undefined if it is not ready.\n */\nexport const useCompiler = (): Compiler | undefined => {\n const manager = usePluginManager();\n useAsyncEffect(async () => {\n await manager.activate(ScriptEvents.SetupCompiler).pipe(EffectEx.runAndForwardErrors);\n }, [manager]);\n const [compiler] = useCapabilities(ScriptCapabilities.Compiler);\n return compiler;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { a as Notebook_exports, i as ScriptCapabilities_exports, n as ScriptOperation_exports, o as Settings_exports, r as ScriptEvents_exports } from "./chunk-types.mjs";
|
|
2
|
+
import { t as skill } from "./chunk-skills.mjs";
|
|
3
|
+
import { n as meta, t as defaultScriptsForIntegration } from "./chunk-meta.mjs";
|
|
4
|
+
import { a as isScriptDeployed, i as deployScript, n as getFunctionUrl, r as updateFunctionMetadata, t as getAccessCredential } from "./chunk-util.mjs";
|
|
5
|
+
export { Notebook_exports as Notebook, ScriptCapabilities_exports as ScriptCapabilities, ScriptEvents_exports as ScriptEvents, ScriptOperation_exports as ScriptOperation, skill as ScriptSkill, Settings_exports as Settings, defaultScriptsForIntegration, deployScript, getAccessCredential, getFunctionUrl, isScriptDeployed, meta, updateFunctionMetadata };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { OperationHandlerSet } from "@dxos/compute";
|
|
2
|
+
//#region src/operations/index.ts
|
|
3
|
+
var ScriptOperationHandlerSet = OperationHandlerSet.lazy(() => import("./chunk-create-script.mjs"));
|
|
4
|
+
//#endregion
|
|
5
|
+
export { ScriptOperationHandlerSet };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=operations.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.mjs","names":[],"sources":["../../src/operations/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { OperationHandlerSet } from '@dxos/compute';\n\nexport const ScriptOperationHandlerSet = OperationHandlerSet.lazy(() => import('./create-script'));\n"],"mappings":";;AAMA,IAAa,4BAA4B,oBAAoB,WAAW,OAAO,4BAAkB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { n as meta } from "./chunk-meta.mjs";
|
|
2
|
+
import { ScriptOperationHandlerSet } from "./operations.mjs";
|
|
3
|
+
import { Plugin } from "@dxos/app-framework";
|
|
4
|
+
//#region src/plugin.ts
|
|
5
|
+
var ScriptPlugin = Plugin.lazy(meta, () => import("#plugin"));
|
|
6
|
+
//#endregion
|
|
7
|
+
export { ScriptOperationHandlerSet, ScriptPlugin };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=plugin.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../src/plugin.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport { meta } from './meta';\n\nexport const ScriptPlugin = Plugin.lazy(meta, () => import('#plugin'));\n\nexport { ScriptOperationHandlerSet } from './operations';\n"],"mappings":";;;;AAQA,IAAa,eAAe,OAAO,KAAK,YAAY,OAAO,UAAU"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Instructions, Operation, Script } from "@dxos/compute";
|
|
2
|
+
import { Obj, Ref, Type } from "@dxos/echo";
|
|
3
|
+
import { PublicKey } from "@dxos/keys";
|
|
4
|
+
import { Text } from "@dxos/schema";
|
|
5
|
+
import { Notebook } from "#types";
|
|
6
|
+
import { createObject } from "@dxos/echo-client";
|
|
7
|
+
import { Markdown } from "@dxos/plugin-markdown";
|
|
8
|
+
//#region src/testing/test-script.ts
|
|
9
|
+
/**
|
|
10
|
+
* Seeds a script and linked persistent operation for Storybook stories.
|
|
11
|
+
*/
|
|
12
|
+
var createScript = (space) => {
|
|
13
|
+
const script = Script.make({
|
|
14
|
+
name: "Test",
|
|
15
|
+
source: "export default () => 42;"
|
|
16
|
+
});
|
|
17
|
+
space.db.add(script);
|
|
18
|
+
space.db.add(Obj.make(Operation.PersistentOperation, {
|
|
19
|
+
[Obj.Meta]: {
|
|
20
|
+
key: "org.dxos.script.story-fn",
|
|
21
|
+
version: "0.1.0"
|
|
22
|
+
},
|
|
23
|
+
name: "Test",
|
|
24
|
+
source: Ref.make(script)
|
|
25
|
+
}));
|
|
26
|
+
return script;
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/testing/test-notebook.ts
|
|
30
|
+
var createNotebook = () => Notebook.make({ cells: [
|
|
31
|
+
{
|
|
32
|
+
id: PublicKey.random().toString(),
|
|
33
|
+
type: "script",
|
|
34
|
+
source: Ref.make(createObject(Text.make({ content: "c = a() + b" })))
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: PublicKey.random().toString(),
|
|
38
|
+
type: "script",
|
|
39
|
+
source: Ref.make(createObject(Text.make({ content: "a = () => 100" })))
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: PublicKey.random().toString(),
|
|
43
|
+
type: "script",
|
|
44
|
+
source: Ref.make(createObject(Text.make({ content: "b = 200" })))
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: PublicKey.random().toString(),
|
|
48
|
+
type: "script",
|
|
49
|
+
source: Ref.make(createObject(Text.make({ content: "d = a() * 2" })))
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: PublicKey.random().toString(),
|
|
53
|
+
type: "script",
|
|
54
|
+
source: Ref.make(createObject(Text.make({ content: "c + d" })))
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: PublicKey.random().toString(),
|
|
58
|
+
type: "prompt",
|
|
59
|
+
prompt: Ref.make(createObject(Instructions.make({ text: "Very briefly, what colors are associated with the numbers {{a}} and {{b}}." })))
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: PublicKey.random().toString(),
|
|
63
|
+
type: "query",
|
|
64
|
+
source: Ref.make(createObject(Text.make({ content: `docs = (type: ${Type.getTypename(Markdown.Document)})` })))
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: PublicKey.random().toString(),
|
|
68
|
+
type: "prompt",
|
|
69
|
+
prompt: Ref.make(createObject(Instructions.make({ text: "Very briefly, summarize the documents: {{docs}}" })))
|
|
70
|
+
}
|
|
71
|
+
] });
|
|
72
|
+
//#endregion
|
|
73
|
+
export { createNotebook, createScript };
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=testing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.mjs","names":[],"sources":["../../src/testing/test-script.ts","../../src/testing/test-notebook.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { Operation, Script } from '@dxos/compute';\nimport { Obj, Ref } from '@dxos/echo';\nimport { type Space } from '@dxos/react-client/echo';\n\n/**\n * Seeds a script and linked persistent operation for Storybook stories.\n */\nexport const createScript = (space: Space): Script.Script => {\n const script = Script.make({\n name: 'Test',\n source: 'export default () => 42;',\n });\n\n space.db.add(script);\n space.db.add(\n Obj.make(Operation.PersistentOperation, {\n [Obj.Meta]: { key: 'org.dxos.script.story-fn', version: '0.1.0' },\n name: 'Test',\n source: Ref.make(script),\n }),\n );\n\n return script;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { Instructions } from '@dxos/compute';\nimport { Ref, Type } from '@dxos/echo';\nimport { createObject } from '@dxos/echo-client';\nimport { PublicKey } from '@dxos/keys';\nimport { Markdown } from '@dxos/plugin-markdown';\nimport { Text } from '@dxos/schema';\n\nimport { Notebook } from '#types';\n\n// TODO(burdon): NOTE: createObject is required for tests.\nexport const createNotebook = (): Notebook.Notebook =>\n Notebook.make({\n cells: [\n {\n id: PublicKey.random().toString(),\n type: 'script',\n source: Ref.make(createObject(Text.make({ content: 'c = a() + b' }))),\n },\n {\n id: PublicKey.random().toString(),\n type: 'script',\n source: Ref.make(createObject(Text.make({ content: 'a = () => 100' }))),\n },\n {\n id: PublicKey.random().toString(),\n type: 'script',\n source: Ref.make(createObject(Text.make({ content: 'b = 200' }))),\n },\n {\n id: PublicKey.random().toString(),\n type: 'script',\n source: Ref.make(createObject(Text.make({ content: 'd = a() * 2' }))),\n },\n {\n id: PublicKey.random().toString(),\n type: 'script',\n source: Ref.make(createObject(Text.make({ content: 'c + d' }))),\n },\n {\n id: PublicKey.random().toString(),\n type: 'prompt',\n prompt: Ref.make(\n createObject(\n Instructions.make({\n text: 'Very briefly, what colors are associated with the numbers {{a}} and {{b}}.',\n }),\n ),\n ),\n },\n {\n id: PublicKey.random().toString(),\n type: 'query',\n source: Ref.make(createObject(Text.make({ content: `docs = (type: ${Type.getTypename(Markdown.Document)})` }))),\n },\n {\n id: PublicKey.random().toString(),\n type: 'prompt',\n prompt: Ref.make(\n createObject(\n Instructions.make({\n text: 'Very briefly, summarize the documents: {{docs}}',\n }),\n ),\n ),\n },\n ],\n });\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,gBAAgB,UAAgC;CAC3D,MAAM,SAAS,OAAO,KAAK;EACzB,MAAM;EACN,QAAQ;CACV,CAAC;CAED,MAAM,GAAG,IAAI,MAAM;CACnB,MAAM,GAAG,IACP,IAAI,KAAK,UAAU,qBAAqB;GACrC,IAAI,OAAO;GAAE,KAAK;GAA4B,SAAS;EAAQ;EAChE,MAAM;EACN,QAAQ,IAAI,KAAK,MAAM;CACzB,CAAC,CACH;CAEA,OAAO;AACT;;;ACbA,IAAa,uBACX,SAAS,KAAK,EACZ,OAAO;CACL;EACE,IAAI,UAAU,OAAO,CAAC,CAAC,SAAS;EAChC,MAAM;EACN,QAAQ,IAAI,KAAK,aAAa,KAAK,KAAK,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC;CACtE;CACA;EACE,IAAI,UAAU,OAAO,CAAC,CAAC,SAAS;EAChC,MAAM;EACN,QAAQ,IAAI,KAAK,aAAa,KAAK,KAAK,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC;CACxE;CACA;EACE,IAAI,UAAU,OAAO,CAAC,CAAC,SAAS;EAChC,MAAM;EACN,QAAQ,IAAI,KAAK,aAAa,KAAK,KAAK,EAAE,SAAS,UAAU,CAAC,CAAC,CAAC;CAClE;CACA;EACE,IAAI,UAAU,OAAO,CAAC,CAAC,SAAS;EAChC,MAAM;EACN,QAAQ,IAAI,KAAK,aAAa,KAAK,KAAK,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC;CACtE;CACA;EACE,IAAI,UAAU,OAAO,CAAC,CAAC,SAAS;EAChC,MAAM;EACN,QAAQ,IAAI,KAAK,aAAa,KAAK,KAAK,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC;CAChE;CACA;EACE,IAAI,UAAU,OAAO,CAAC,CAAC,SAAS;EAChC,MAAM;EACN,QAAQ,IAAI,KACV,aACE,aAAa,KAAK,EAChB,MAAM,6EACR,CAAC,CACH,CACF;CACF;CACA;EACE,IAAI,UAAU,OAAO,CAAC,CAAC,SAAS;EAChC,MAAM;EACN,QAAQ,IAAI,KAAK,aAAa,KAAK,KAAK,EAAE,SAAS,iBAAiB,KAAK,YAAY,SAAS,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;CAChH;CACA;EACE,IAAI,UAAU,OAAO,CAAC,CAAC,SAAS;EAChC,MAAM;EACN,QAAQ,IAAI,KACV,aACE,aAAa,KAAK,EAChB,MAAM,kDACR,CAAC,CACH,CACF;CACF;AACF,EACF,CAAC"}
|