@dxos/plugin-script 0.11.0 → 0.12.0-next-bbabc02363f18d7643ea4160e3a7a7809870fd0d
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/Notebook.mjs +33 -0
- package/dist/lib/Notebook.mjs.map +1 -0
- package/dist/lib/ScriptCapabilities.mjs +14 -0
- package/dist/lib/ScriptCapabilities.mjs.map +1 -0
- package/dist/lib/ScriptEvents.mjs +19 -0
- package/dist/lib/ScriptEvents.mjs.map +1 -0
- package/dist/lib/ScriptOperation.mjs +33 -0
- package/dist/lib/ScriptOperation.mjs.map +1 -0
- package/dist/lib/ScriptPlugin.mjs +5 -12
- package/dist/lib/ScriptPlugin.mjs.map +1 -1
- package/dist/lib/ScriptPlugin.node.mjs +4 -4
- package/dist/lib/ScriptPlugin.node.mjs.map +1 -1
- package/dist/lib/ScriptPlugin.workerd.mjs +4 -4
- package/dist/lib/ScriptPlugin.workerd.mjs.map +1 -1
- package/dist/lib/Settings.mjs +13 -0
- package/dist/lib/Settings.mjs.map +1 -0
- package/dist/lib/capabilities/node.mjs +8 -7
- package/dist/lib/capabilities/node.mjs.map +1 -1
- package/dist/lib/capabilities.mjs +24 -8
- package/dist/lib/capabilities.mjs.map +1 -1
- package/dist/lib/chunk-DeploymentDialog.mjs +1 -1
- package/dist/lib/chunk-DeploymentDialog.mjs.map +1 -1
- package/dist/lib/chunk-NotebookArticle.mjs +13 -11
- package/dist/lib/chunk-NotebookArticle.mjs.map +1 -1
- package/dist/lib/chunk-ScriptArticle.mjs.map +1 -1
- package/dist/lib/chunk-ScriptProperties.mjs +6 -4
- package/dist/lib/chunk-ScriptProperties.mjs.map +1 -1
- package/dist/lib/chunk-ScriptSettings.mjs +2 -2
- package/dist/lib/chunk-ScriptSettings.mjs.map +1 -1
- package/dist/lib/chunk-TestContainer.mjs.map +1 -1
- package/dist/lib/chunk-app-graph-builder.mjs +5 -4
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -1
- package/dist/lib/chunk-compiler2.mjs +7 -7
- package/dist/lib/chunk-compiler2.mjs.map +1 -1
- package/dist/lib/chunk-create-object.mjs +15 -12
- package/dist/lib/chunk-create-object.mjs.map +1 -1
- package/dist/lib/chunk-create-script.mjs +3 -2
- package/dist/lib/chunk-create-script.mjs.map +1 -1
- package/dist/lib/chunk-create.mjs +3 -2
- package/dist/lib/chunk-create.mjs.map +1 -1
- package/dist/lib/chunk-delete.mjs +1 -1
- package/dist/lib/chunk-delete.mjs.map +1 -1
- package/dist/lib/chunk-deploy.mjs +3 -3
- package/dist/lib/chunk-deploy.mjs.map +1 -1
- package/dist/lib/chunk-functions.mjs +15 -4
- package/dist/lib/chunk-functions.mjs.map +1 -1
- package/dist/lib/chunk-inspect-invocations.mjs +1 -1
- package/dist/lib/chunk-inspect-invocations.mjs.map +1 -1
- package/dist/lib/chunk-install-function.mjs +2 -2
- package/dist/lib/chunk-install-function.mjs.map +1 -1
- package/dist/lib/chunk-invoke.mjs +2 -2
- package/dist/lib/chunk-invoke.mjs.map +1 -1
- package/dist/lib/chunk-meta.mjs +3 -3
- package/dist/lib/chunk-meta.mjs.map +1 -1
- package/dist/lib/chunk-operation-handler.mjs +4 -3
- package/dist/lib/chunk-operation-handler.mjs.map +1 -1
- package/dist/lib/chunk-query-deployed-functions.mjs +2 -2
- package/dist/lib/chunk-query-deployed-functions.mjs.map +1 -1
- package/dist/lib/chunk-react-surface.mjs +9 -7
- package/dist/lib/chunk-react-surface.mjs.map +1 -1
- package/dist/lib/chunk-read.mjs +1 -1
- package/dist/lib/chunk-read.mjs.map +1 -1
- package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
- package/dist/lib/chunk-settings.mjs +7 -6
- package/dist/lib/chunk-settings.mjs.map +1 -1
- package/dist/lib/chunk-skill-definition.mjs +3 -3
- package/dist/lib/chunk-skill-definition.mjs.map +1 -1
- package/dist/lib/chunk-skills.mjs +2 -1
- package/dist/lib/chunk-skills.mjs.map +1 -1
- package/dist/lib/chunk-templates.mjs +6 -6
- package/dist/lib/chunk-update.mjs +1 -1
- package/dist/lib/chunk-update.mjs.map +1 -1
- package/dist/lib/chunk-util.mjs +7 -7
- package/dist/lib/chunk-util.mjs.map +1 -1
- package/dist/lib/components.mjs +3 -2
- package/dist/lib/components.mjs.map +1 -1
- package/dist/lib/hooks.mjs +12 -9
- package/dist/lib/hooks.mjs.map +1 -1
- package/dist/lib/index.mjs +6 -2
- package/dist/lib/operations.mjs +4 -2
- package/dist/lib/operations.mjs.map +1 -1
- package/dist/lib/plugin.mjs +2 -3
- package/dist/lib/plugin.mjs.map +1 -1
- package/dist/lib/testing.mjs +7 -5
- package/dist/lib/testing.mjs.map +1 -1
- package/dist/lib/translations.mjs +3 -3
- package/dist/lib/translations.mjs.map +1 -1
- package/dist/types/src/ScriptPlugin.d.ts +1 -1
- package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
- package/dist/types/src/ScriptPlugin.node.d.ts +1 -1
- package/dist/types/src/ScriptPlugin.node.d.ts.map +1 -1
- package/dist/types/src/ScriptPlugin.workerd.d.ts +1 -1
- package/dist/types/src/ScriptPlugin.workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/ScriptSurfaces.d.ts +3 -3
- package/dist/types/src/capabilities/ScriptSurfaces.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +2 -2
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/compiler.d.ts +2 -2
- package/dist/types/src/capabilities/compiler.d.ts.map +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +2 -2
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +8 -9
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/node.d.ts +4 -7
- package/dist/types/src/capabilities/node.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +2 -3
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +2 -2
- package/dist/types/src/capabilities/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/skill-definition.d.ts +2 -2
- package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -1
- package/dist/types/src/components/NotebookStack/NotebookCell.d.ts +1 -1
- package/dist/types/src/components/NotebookStack/NotebookCell.d.ts.map +1 -1
- package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts +1 -1
- package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts.map +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 +1 -1
- package/dist/types/src/components/QueryEditor/QueryEditor.stories.d.ts +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/ScriptToolbar/ScriptToolbar.stories.d.ts +1 -1
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +1 -1
- package/dist/types/src/containers/DeploymentDialog/DeploymentDialog.stories.d.ts +1 -1
- package/dist/types/src/containers/NotebookArticle/NotebookArticle.d.ts +1 -1
- package/dist/types/src/containers/NotebookArticle/NotebookArticle.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptArticle/ScriptArticle.d.ts +2 -2
- package/dist/types/src/containers/ScriptArticle/ScriptArticle.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptArticle/ScriptArticle.stories.d.ts +1 -1
- package/dist/types/src/containers/ScriptProperties/FunctionBinding.d.ts +1 -1
- package/dist/types/src/containers/ScriptProperties/FunctionBinding.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptProperties/FunctionPublishing.d.ts +1 -1
- package/dist/types/src/containers/ScriptProperties/FunctionPublishing.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptProperties/ScriptProperties.d.ts +1 -1
- package/dist/types/src/containers/ScriptProperties/ScriptProperties.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptProperties/ScriptProperties.stories.d.ts +1 -1
- package/dist/types/src/containers/ScriptProperties/SkillEditor.d.ts +1 -1
- package/dist/types/src/containers/ScriptProperties/SkillEditor.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptSettings/ScriptSettings.d.ts +1 -1
- package/dist/types/src/containers/ScriptSettings/ScriptSettings.d.ts.map +1 -1
- package/dist/types/src/containers/ScriptSettings/ScriptSettings.stories.d.ts +1 -1
- package/dist/types/src/containers/TestContainer/TestContainer.d.ts +1 -1
- package/dist/types/src/containers/TestContainer/TestContainer.d.ts.map +1 -1
- package/dist/types/src/hooks/deploy.d.ts +2 -1
- package/dist/types/src/hooks/deploy.d.ts.map +1 -1
- package/dist/types/src/hooks/format.d.ts +1 -1
- package/dist/types/src/hooks/format.d.ts.map +1 -1
- package/dist/types/src/hooks/template.d.ts +1 -1
- package/dist/types/src/hooks/template.d.ts.map +1 -1
- package/dist/types/src/hooks/useCompiler.d.ts.map +1 -1
- package/dist/types/src/hooks/useCreateAndDeployScriptTemplates.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +6 -2
- package/dist/types/src/index.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/operations/create-script.d.ts +2 -2
- package/dist/types/src/operations/create-script.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/plugin.d.ts +1 -2
- package/dist/types/src/plugin.d.ts.map +1 -1
- package/dist/types/src/skills/functions/create.d.ts +1 -1
- package/dist/types/src/skills/functions/create.d.ts.map +1 -1
- package/dist/types/src/skills/functions/definitions.d.ts +1 -1
- package/dist/types/src/skills/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/skills/functions/delete.d.ts +1 -1
- package/dist/types/src/skills/functions/delete.d.ts.map +1 -1
- package/dist/types/src/skills/functions/deploy.d.ts +1 -1
- package/dist/types/src/skills/functions/deploy.d.ts.map +1 -1
- package/dist/types/src/skills/functions/index.d.ts +1 -1
- package/dist/types/src/skills/functions/index.d.ts.map +1 -1
- package/dist/types/src/skills/functions/inspect-invocations.d.ts +1 -1
- package/dist/types/src/skills/functions/inspect-invocations.d.ts.map +1 -1
- package/dist/types/src/skills/functions/install-function.d.ts +1 -1
- package/dist/types/src/skills/functions/install-function.d.ts.map +1 -1
- package/dist/types/src/skills/functions/invoke.d.ts +1 -1
- package/dist/types/src/skills/functions/invoke.d.ts.map +1 -1
- package/dist/types/src/skills/functions/query-deployed-functions.d.ts +1 -1
- package/dist/types/src/skills/functions/query-deployed-functions.d.ts.map +1 -1
- package/dist/types/src/skills/functions/read.d.ts +1 -1
- package/dist/types/src/skills/functions/read.d.ts.map +1 -1
- package/dist/types/src/skills/functions/update.d.ts +1 -1
- package/dist/types/src/skills/functions/update.d.ts.map +1 -1
- package/dist/types/src/skills/script-skill.d.ts +1 -1
- package/dist/types/src/skills/script-skill.d.ts.map +1 -1
- package/dist/types/src/templates/anthropic.d.ts +1 -1
- package/dist/types/src/templates/anthropic.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/templates/forex-effect.d.ts +1 -1
- package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
- package/dist/types/src/templates/forex.d.ts +1 -1
- package/dist/types/src/templates/forex.d.ts.map +1 -1
- package/dist/types/src/templates/ping.d.ts +1 -1
- package/dist/types/src/templates/ping.d.ts.map +1 -1
- package/dist/types/src/testing/test-notebook.d.ts +1 -1
- package/dist/types/src/testing/test-notebook.d.ts.map +1 -1
- package/dist/types/src/testing/test-script.d.ts +1 -1
- package/dist/types/src/testing/test-script.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Notebook.d.ts +2 -2
- package/dist/types/src/types/Notebook.d.ts.map +1 -1
- package/dist/types/src/types/ScriptCapabilities.d.ts +3 -3
- package/dist/types/src/types/ScriptCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/ScriptEvents.d.ts +7 -1
- package/dist/types/src/types/ScriptEvents.d.ts.map +1 -1
- package/dist/types/src/types/ScriptOperation.d.ts +2 -1
- package/dist/types/src/types/ScriptOperation.d.ts.map +1 -1
- package/dist/types/src/util/deploy.d.ts +2 -1
- package/dist/types/src/util/deploy.d.ts.map +1 -1
- package/dist/types/src/util/functions.d.ts +2 -1
- package/dist/types/src/util/functions.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +1 -1
- package/package.json +115 -82
- package/src/ScriptPlugin.node.ts +8 -8
- package/src/ScriptPlugin.test.ts +3 -6
- package/src/ScriptPlugin.tsx +20 -22
- package/src/ScriptPlugin.workerd.ts +5 -5
- package/src/capabilities/ScriptSurfaces.tsx +5 -3
- package/src/capabilities/app-graph-builder.ts +5 -4
- package/src/capabilities/compiler.ts +3 -4
- package/src/capabilities/create-object.ts +34 -31
- package/src/capabilities/index.ts +28 -11
- package/src/capabilities/node.ts +9 -10
- package/src/capabilities/operation-handler.ts +5 -4
- package/src/capabilities/react-surface.ts +5 -4
- package/src/capabilities/settings.ts +7 -5
- package/src/capabilities/skill-definition.ts +3 -3
- package/src/components/NotebookStack/NotebookCell.tsx +1 -1
- package/src/components/NotebookStack/NotebookMenu.tsx +2 -1
- package/src/components/NotebookStack/NotebookStack.tsx +1 -1
- package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +1 -1
- package/src/components/ScriptToolbar/ScriptToolbar.tsx +4 -2
- package/src/containers/DeploymentDialog/DeploymentDialog.tsx +1 -1
- package/src/containers/NotebookArticle/NotebookArticle.stories.tsx +7 -7
- package/src/containers/NotebookArticle/NotebookArticle.tsx +5 -4
- package/src/containers/ScriptArticle/ScriptArticle.stories.tsx +3 -3
- package/src/containers/ScriptArticle/ScriptArticle.tsx +3 -2
- package/src/containers/ScriptProperties/FunctionBinding.tsx +2 -2
- package/src/containers/ScriptProperties/FunctionPublishing.tsx +5 -3
- package/src/containers/ScriptProperties/ScriptProperties.stories.tsx +3 -3
- package/src/containers/ScriptProperties/ScriptProperties.tsx +1 -1
- package/src/containers/ScriptProperties/SkillEditor.tsx +4 -3
- package/src/containers/ScriptSettings/ScriptSettings.tsx +2 -1
- package/src/containers/TestContainer/TestContainer.tsx +1 -1
- package/src/e2e/ai.test.ts +1 -1
- package/src/hooks/deploy.ts +2 -1
- package/src/hooks/format.ts +1 -1
- package/src/hooks/template.ts +1 -1
- package/src/hooks/useCompiler.ts +2 -3
- package/src/hooks/useCreateAndDeployScriptTemplates.ts +2 -3
- package/src/hooks/useToolbarState.ts +1 -1
- package/src/index.ts +6 -2
- package/src/meta.ts +1 -1
- package/src/notebook/compute-graph.ts +1 -2
- package/src/operations/create-script.ts +3 -2
- package/src/operations/index.ts +7 -2
- package/src/plugin.ts +1 -3
- package/src/skills/functions/create.ts +3 -2
- package/src/skills/functions/definitions.ts +1 -1
- package/src/skills/functions/delete.ts +1 -1
- package/src/skills/functions/deploy.ts +2 -1
- package/src/skills/functions/index.ts +25 -12
- package/src/skills/functions/inspect-invocations.ts +1 -1
- 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/skills/functions/read.ts +2 -1
- package/src/skills/functions/update.ts +2 -1
- package/src/skills/script-skill.ts +2 -1
- package/src/templates/anthropic.ts +1 -1
- package/src/templates/chess-bot.ts +5 -4
- package/src/templates/commentary.ts +8 -6
- package/src/templates/forex-effect.ts +1 -1
- package/src/templates/forex.ts +1 -1
- package/src/templates/ping.ts +1 -1
- package/src/testing/test-notebook.ts +3 -3
- package/src/testing/test-script.ts +2 -1
- package/src/translations.ts +3 -2
- package/src/types/Notebook.ts +2 -2
- package/src/types/ScriptCapabilities.ts +3 -3
- package/src/types/ScriptEvents.ts +8 -1
- package/src/types/ScriptOperation.ts +2 -1
- package/src/util/deploy.ts +2 -1
- package/src/util/functions.ts +2 -1
- package/dist/lib/chunk-types.mjs +0 -90
- package/dist/lib/chunk-types.mjs.map +0 -1
- package/dist/lib/types.mjs +0 -2
- package/dist/types/src/types/index.d.ts +0 -6
- package/dist/types/src/types/index.d.ts.map +0 -1
- package/dist/types/src/types/types.d.ts +0 -2
- package/dist/types/src/types/types.d.ts.map +0 -1
- package/src/types/index.ts +0 -10
- package/src/types/types.ts +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-settings.mjs","names":[],"sources":["../../src/capabilities/settings.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport
|
|
1
|
+
{"version":3,"file":"chunk-settings.mjs","names":[],"sources":["../../src/capabilities/settings.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport { createKvsStore } from '@dxos/effect';\n\nimport { meta } from '#meta';\n\nimport * as ScriptCapabilities from '../types/ScriptCapabilities';\nimport * as Settings from '../types/Settings';\n\nexport default Capability.makeModule(() =>\n Effect.sync(() => {\n const settingsAtom = createKvsStore({\n key: meta.profile.key,\n schema: Settings.Settings,\n defaultValue: () => ({\n editorInputMode: 'vscode' as const,\n }),\n });\n\n return [\n Capability.contribute(ScriptCapabilities.Settings, settingsAtom),\n Capability.contribute(AppCapabilities.Settings, {\n prefix: meta.profile.key,\n schema: Settings.Settings,\n atom: settingsAtom,\n }),\n ];\n }),\n);\n"],"mappings":";;;;;;;;AAeA,IAAA,mBAAe,WAAW,iBACxB,OAAO,WAAW;CAChB,MAAM,eAAe,eAAe;EAClC,KAAK,KAAK,QAAQ;EAClB,QAAQ;EACR,qBAAqB,EACnB,iBAAiB,SACnB;CACF,CAAC;CAED,OAAO,CACL,WAAW,WAAW,UAA6B,YAAY,GAC/D,WAAW,WAAW,gBAAgB,UAAU;EAC9C,QAAQ,KAAK,QAAQ;EACrB,QAAQ;EACR,MAAM;CACR,CAAC,CACH;AACF,CAAC,CACH"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { AppCapabilities } from "@dxos/app-toolkit";
|
|
1
|
+
import * as Capability from "@dxos/app-framework/Capability";
|
|
3
2
|
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as AppCapabilities from "@dxos/app-toolkit/AppCapabilities";
|
|
4
4
|
import { ScriptSkill } from "#skills";
|
|
5
5
|
//#region src/capabilities/skill-definition.ts
|
|
6
|
-
var skillDefinition = () => Effect.succeed([Capability.
|
|
6
|
+
var skillDefinition = () => Effect.succeed([Capability.contribute(AppCapabilities.SkillDefinition, ScriptSkill)]);
|
|
7
7
|
//#endregion
|
|
8
8
|
export { skillDefinition as default };
|
|
9
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-skill-definition.mjs","names":[],"sources":["../../src/capabilities/skill-definition.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport
|
|
1
|
+
{"version":3,"file":"chunk-skill-definition.mjs","names":[],"sources":["../../src/capabilities/skill-definition.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\n\nimport { ScriptSkill } from '#skills';\n\nconst skillDefinition = () => Effect.succeed([Capability.contribute(AppCapabilities.SkillDefinition, ScriptSkill)]);\n\nexport default skillDefinition;\n"],"mappings":";;;;;AAWA,IAAM,wBAAwB,OAAO,QAAQ,CAAC,WAAW,WAAW,gBAAgB,iBAAiB,WAAW,CAAC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { a as InspectInvocations, c as QueryDeployedFunctions, i as Deploy, l as Read, n as Create, o as InstallFunction, r as Delete, s as Invoke, u as Update } from "./chunk-functions.mjs";
|
|
2
|
-
import { Skill, Template } from "@dxos/compute";
|
|
3
2
|
import { trim } from "@dxos/util";
|
|
3
|
+
import * as Skill from "@dxos/compute/Skill";
|
|
4
|
+
import * as Template from "@dxos/compute/Template";
|
|
4
5
|
//#region src/skills/script-skill.ts
|
|
5
6
|
var SKILL_KEY = "org.dxos.skill.script";
|
|
6
7
|
var make = () => Skill.make({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-skills.mjs","names":[],"sources":["../../src/skills/script-skill.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport
|
|
1
|
+
{"version":3,"file":"chunk-skills.mjs","names":[],"sources":["../../src/skills/script-skill.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Skill from '@dxos/compute/Skill';\nimport * as Template from '@dxos/compute/Template';\nimport { trim } from '@dxos/util';\n\nimport {\n Create,\n Delete,\n Deploy,\n InspectInvocations,\n InstallFunction,\n Invoke,\n QueryDeployedFunctions,\n Read,\n Update,\n} from './functions';\n\nconst SKILL_KEY = 'org.dxos.skill.script';\n\nconst make = () =>\n Skill.make({\n key: SKILL_KEY,\n name: 'Script',\n agentCanEnable: true,\n tools: Skill.toolDefinitions({\n operations: [\n Create,\n Read,\n Update,\n Delete,\n Deploy,\n Invoke,\n InspectInvocations,\n QueryDeployedFunctions,\n InstallFunction,\n ],\n }),\n instructions: Template.make({\n source: trim`\n You can create, read, update, and delete scripts which contain TypeScript code.\n You can deploy scripts to the Edge runtime and invoke deployed scripts.\n You can inspect the invocation history of a deployed script.\n You can query all functions deployed to the EDGE runtime and install them into the current space.\n `,\n }),\n });\n\nconst skill: Skill.Definition = {\n key: SKILL_KEY,\n make,\n};\n\nexport default skill;\n"],"mappings":";;;;;AAoBA,IAAM,YAAY;AAElB,IAAM,aACJ,MAAM,KAAK;CACT,KAAK;CACL,MAAM;CACN,gBAAgB;CAChB,OAAO,MAAM,gBAAgB,EAC3B,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,EACF,CAAC;CACD,cAAc,SAAS,KAAK,EAC1B,QAAQ,IAAI;;;;;QAMd,CAAC;AACH,CAAC;AAEH,IAAM,QAA0B;CAC9B,KAAK;CACL;AACF"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
//#region src/templates/anthropic.ts?raw
|
|
2
|
-
var anthropic_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as LanguageModel from '@effect/ai/LanguageModel';\nimport * as Chunk from 'effect/Chunk';\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\nimport * as Stream from 'effect/Stream';\n\nimport { AiService } from '@dxos/ai';\nimport
|
|
2
|
+
var anthropic_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as LanguageModel from '@effect/ai/LanguageModel';\nimport * as Chunk from 'effect/Chunk';\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\nimport * as Stream from 'effect/Stream';\n\nimport { AiService } from '@dxos/ai';\nimport * as Operation from '@dxos/compute/Operation';\nimport { DXN } from '@dxos/keys';\n\nconst Anthropic = Operation.make({\n meta: {\n key: DXN.make('org.dxos.script.anthropic'),\n name: 'Anthropic Chat',\n description: 'Chat with Anthropic',\n },\n input: Schema.Struct({\n message: Schema.String,\n }),\n output: Schema.Any,\n services: [AiService.AiService],\n});\n\nexport default Anthropic.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ message }) {\n const model = AiService.model('com.anthropic.model.claude-sonnet-4-6.default');\n\n //\n // Basic example.\n //\n const { text } = yield* LanguageModel.generateText({ prompt: message }).pipe(Effect.provide(model));\n\n //\n // Streaming example.\n //\n const parts = yield* LanguageModel.streamText({\n prompt: 'Count from 1 to 5, one number per line.',\n }).pipe(Stream.runCollect, Effect.map(Chunk.toArray), Effect.provide(model));\n const textDeltas = parts.filter((p) => p.type === 'text-delta');\n const fullText = textDeltas.map((p) => (p as { delta: string }).delta).join('');\n\n return { response: text, streamText: fullText };\n }),\n ),\n);\n";
|
|
3
3
|
//#endregion
|
|
4
4
|
//#region src/templates/chess-bot.ts?raw
|
|
5
|
-
var chess_bot_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Chess as ChessJS } from 'chess.js';\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport
|
|
5
|
+
var chess_bot_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Chess as ChessJS } from 'chess.js';\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport { Database, DXN, Obj } from '@dxos/echo';\nimport * as Chess from '@dxos/plugin-chess/Chess';\nimport * as Game from '@dxos/plugin-game/Game';\nimport * as GameUtil from '@dxos/plugin-game/GameUtil';\n\nconst ChessBot = Operation.make({\n meta: {\n key: DXN.make('org.dxos.script.chessBot'),\n name: 'Chess Bot',\n description: 'Plays a random move in a chess game.',\n },\n input: Schema.Struct({\n game: Game.GameRef(Chess.State).annotations({\n description: 'The chess game to comment on.',\n }),\n player: Schema.optional(Schema.Literal('white', 'black')).annotations({\n description: 'The player to play the game as.',\n }),\n }),\n output: Schema.Struct({\n state: Schema.String.annotations({\n description: 'The state of the game as an ASCII art board.',\n }),\n }),\n types: [Game.Game, Chess.State],\n services: [Database.Service],\n});\n\nexport default ChessBot.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ game, player = 'black' }) {\n const { variant } = yield* GameUtil.loadGame(game, Chess.State);\n const chess = new ChessJS();\n chess.loadPgn(variant.pgn ?? '');\n if (chess.turn() !== (player === 'white' ? 'w' : 'b')) {\n return { state: chess.ascii() };\n }\n\n const moves = chess.moves({ verbose: true });\n const move = moves[Math.floor(Math.random() * moves.length)];\n if (!move) {\n return { state: chess.ascii() };\n }\n\n chess.move(move.san);\n const newPgn = chess.pgn();\n Obj.update(variant, (variant) => {\n const mutable = variant as Obj.Mutable<typeof variant>;\n mutable.pgn = newPgn;\n });\n yield* Database.flush();\n return { state: chess.ascii() };\n }),\n ),\n);\n";
|
|
6
6
|
//#endregion
|
|
7
7
|
//#region src/templates/commentary.ts?raw
|
|
8
|
-
var commentary_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as A from '@automerge/automerge';\nimport { Chess as ChessJS } from 'chess.js';\nimport * as Array from 'effect/Array';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\n\nimport { AiService, ConsolePrinter, ToolExecutionService, ToolResolverService } from '@dxos/ai';\nimport { AppAnnotation } from '@dxos/app-toolkit';\nimport { AiRequest, GenerationObserver } from '@dxos/assistant';\nimport { Operation, Trace } from '@dxos/compute';\nimport { Annotation, Collection, Database, DXN, Filter, Obj, Ref, Relation, URI } from '@dxos/echo';\nimport { Doc } from '@dxos/echo-doc';\nimport { registryLayerNoop } from '@dxos/echo/testing';\nimport { log } from '@dxos/log';\nimport { Chess } from '@dxos/plugin-chess';\nimport { Game, loadGame } from '@dxos/plugin-game';\nimport { Markdown } from '@dxos/plugin-markdown';\nimport { Text } from '@dxos/schema';\nimport { HasSubject } from '@dxos/types';\nimport { trim } from '@dxos/util';\n\nconst Commentary = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.chess.commentary'),\n name: 'Commentary',\n description: 'Adds commentary about the most recent move to a markdown document associated with the chess game.',\n },\n input: Schema.Struct({\n game: Game.GameRef(Chess.State).annotations({\n description: 'The chess game to comment on.',\n }),\n }),\n output: Schema.Union(\n Schema.Struct({\n documentId: URI.Schema.annotations({\n description: 'The ID of the markdown document that was updated or created.',\n }),\n commentary: Schema.String.annotations({\n description: 'The commentary that was added.',\n }),\n }),\n Schema.Void.annotations({\n description: 'Function did not find anything to comment on.',\n }),\n ),\n types: [Game.Game, Chess.State, Markdown.Document, Text.Text, HasSubject.HasSubject, Collection.Collection],\n services: [AiService.AiService, Database.Service],\n});\n\nexport default Commentary.pipe(\n Operation.withHandler(\n Effect.fnUntraced(\n function* ({ game: gameRef }) {\n // Load the game and its Chess variant state.\n log.info('load game', { gameRef });\n const { game: chessGame, variant: chessState } = yield* loadGame(gameRef, Chess.State);\n\n // Load the chess position from PGN or FEN.\n const chess = new ChessJS();\n if (chessState.pgn) {\n chess.loadPgn(chessState.pgn);\n } else if (chessState.fen) {\n chess.load(chessState.fen);\n } else {\n log.info('Early return: no pgn or fen');\n return;\n }\n\n // Get the most recent move\n const history = chess.history({ verbose: true });\n if (history.length === 0) {\n throw new Error('No moves have been played yet');\n }\n const lastMove = history[history.length - 1];\n const moveNumber = Math.ceil(history.length / 2);\n const isWhiteMove = history.length % 2 === 1;\n const player = isWhiteMove ? 'White' : 'Black';\n const moveNotation = lastMove.san;\n\n // Generate AI commentary about the move\n const result = yield* new AiRequest.Request({\n observer: GenerationObserver.fromPrinter(new ConsolePrinter({ tag: 'chess-commentary' })),\n }).run({\n prompt:\n `Comment on this chess move as if you're commentating a live match for an audience:\\n\\n` +\n `Move ${moveNumber}: ${player} plays ${moveNotation} (${lastMove.from} to ${lastMove.to})${lastMove.captured ? `, capturing ${lastMove.captured}` : ''}\\n` +\n `Current position: ${chess.fen()}\\n` +\n `${chess.isCheck() ? 'The king is in check! ' : ''}` +\n `${chess.isCheckmate() ? 'CHECKMATE! ' : ''}` +\n `${chess.isStalemate() ? 'STALEMATE! ' : ''}` +\n `\\nGame so far:\\n${chess.pgn()}`,\n system: COMMENTARY_SYSTEM_PROMPT,\n history: [],\n });\n\n const commentaryText = Function.pipe(\n result,\n Array.findLast((msg) => msg.sender.role === 'assistant' && msg.blocks.some((block) => block._tag === 'text')),\n Option.flatMap((msg) =>\n Function.pipe(\n msg.blocks,\n Array.findLast((block) => block._tag === 'text'),\n Option.map((block) => block.text),\n ),\n ),\n Option.getOrThrowWith(() => new Error('No commentary generated')),\n );\n\n const commentary = `## Move ${moveNumber}: ${player} plays ${moveNotation}\\n\\n${commentaryText}\\n\\n`;\n log.info('commentary', { commentary });\n\n // TODO(wittjosiah): Functions currently don't support traversals.\n // const docs = yield* Database.query(\n // Query.select(Filter.id(chessGame.id)).targetOf(HasSubject.HasSubject).source(),\n // ).run.pipe(Effect.map((objects) => objects.filter((object) => Obj.instanceOf(Markdown.Document, object))));\n const docs = yield* Database.query(Filter.type(HasSubject.HasSubject)).run.pipe(\n Effect.map((relations) =>\n relations.filter((relation) => {\n // TODO(wittjosiah): This is a workaround for getTarget not handling deleted objects.\n try {\n log.info('relation', {\n source: Obj.getURI(Relation.getTarget(relation)),\n game: Obj.getURI(chessGame),\n });\n return Obj.getURI(Relation.getTarget(relation)) === Obj.getURI(chessGame);\n } catch {\n return false;\n }\n }),\n ),\n Effect.map((relations) =>\n relations\n .map((relation) => {\n // TODO(wittjosiah): This is a workaround for getSource not handling deleted objects.\n try {\n return Relation.getSource(relation);\n } catch {\n return undefined;\n }\n })\n .filter((source) => source !== undefined),\n ),\n Effect.map((sources) => {\n const docs = sources.filter((source) => Obj.instanceOf(Markdown.Document, source));\n log.info('docs', { sources, docs });\n return docs;\n }),\n );\n log.info('docs', { count: docs.length });\n\n let document: Markdown.Document;\n if (docs.length === 0) {\n // TODO(wittjosiah): Deploy fails if `SpaceProperties` schema is imported because its from `client-protocol`.\n const [properties] = yield* Database.query(Filter.type(DXN.make('org.dxos.type.spaceProperties'))).run;\n const rootCollectionRef = Annotation.get(properties, AppAnnotation.RootCollectionAnnotation).pipe(\n Option.getOrUndefined,\n );\n const rootCollection = rootCollectionRef\n ? yield* Database.load<Collection.Collection>(rootCollectionRef)\n : undefined;\n\n log.info('rootCollection', { rootCollection });\n\n // Create a new markdown document\n const gameName = chessGame.name || 'Chess Game';\n document = yield* Database.add(\n Markdown.make({\n name: `${gameName} Commentary`,\n content: `# ${gameName} Commentary\\n\\n${commentary}`,\n }),\n );\n\n const documentRef = Ref.make(document);\n if (rootCollection) {\n Obj.update(rootCollection, (rootCollection) => {\n rootCollection.objects.push(documentRef);\n });\n }\n\n // Create the HasSubject relation\n yield* Database.add(\n Relation.make(HasSubject.HasSubject, {\n [Relation.Source]: document,\n [Relation.Target]: chessGame,\n }),\n );\n } else {\n document = docs[0];\n\n // Load the text content and append the commentary\n const text = yield* Database.load(document.content);\n const accessor = Doc.createAccessor(text, ['content']);\n accessor.handle.change((doc: A.Doc<Text.Text>) => {\n A.splice(doc, accessor.path.slice(), text.content.length, 0, commentary);\n });\n }\n\n log.info('result', { documentId: Obj.getURI(document), commentary });\n\n yield* Database.flush();\n\n return {\n documentId: Obj.getURI(document),\n commentary,\n };\n },\n Effect.provide(\n Layer.mergeAll(\n AiService.model('com.anthropic.model.claude-haiku-4-5.default'),\n ToolResolverService.layerEmpty,\n ToolExecutionService.layerEmpty,\n Trace.writerLayerNoop,\n Database.notAvailable,\n Layer.succeed(Operation.Service, {\n invoke: () => Effect.die('Not available.'),\n schedule: () => Effect.die('Not available.'),\n invokePromise: async () => ({ error: new Error('Not available.') }),\n } as any),\n registryLayerNoop,\n ),\n ),\n ),\n ),\n);\n\nconst COMMENTARY_SYSTEM_PROMPT = trim`\n You are a professional chess commentator providing live commentary for a chess match.\n\n # Style\n - Write in an engaging, enthusiastic style as if commentating for a live audience\n - Be concise but informative (2-4 sentences)\n - Explain the strategic implications of the move\n - Note any tactical elements (captures, threats, checks)\n - Comment on the position and what it means for the game\n\n # Format\n - Write in plain text (no markdown formatting in the commentary itself)\n - Be natural and conversational\n - Use chess terminology appropriately but keep it accessible\n\n # Special Situations\n - If it's checkmate, express excitement about the conclusion\n - If it's check, note the pressure on the king\n - If a piece is captured, mention the material exchange\n - Comment on the development of pieces and control of key squares when relevant\n`;\n";
|
|
8
|
+
var commentary_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as A from '@automerge/automerge';\nimport { Chess as ChessJS } from 'chess.js';\nimport * as Array from 'effect/Array';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\n\nimport { AiService, ConsolePrinter, ToolExecutionService, ToolResolverService } from '@dxos/ai';\nimport * as AppAnnotation from '@dxos/app-toolkit/AppAnnotation';\nimport { AiRequest, GenerationObserver } from '@dxos/assistant';\nimport * as Operation from '@dxos/compute/Operation';\nimport * as Trace from '@dxos/compute/Trace';\nimport { Annotation, Collection, Database, DXN, Filter, Obj, Ref, Relation, URI } from '@dxos/echo';\nimport { Doc } from '@dxos/echo-doc';\nimport { registryLayerNoop } from '@dxos/echo/testing';\nimport { log } from '@dxos/log';\nimport * as Chess from '@dxos/plugin-chess/Chess';\nimport * as Game from '@dxos/plugin-game/Game';\nimport * as GameUtil from '@dxos/plugin-game/GameUtil';\nimport * as Markdown from '@dxos/plugin-markdown/Markdown';\nimport { Text } from '@dxos/schema';\nimport { HasSubject } from '@dxos/types';\nimport { trim } from '@dxos/util';\n\nconst Commentary = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.chess.commentary'),\n name: 'Commentary',\n description: 'Adds commentary about the most recent move to a markdown document associated with the chess game.',\n },\n input: Schema.Struct({\n game: Game.GameRef(Chess.State).annotations({\n description: 'The chess game to comment on.',\n }),\n }),\n output: Schema.Union(\n Schema.Struct({\n documentId: URI.Schema.annotations({\n description: 'The ID of the markdown document that was updated or created.',\n }),\n commentary: Schema.String.annotations({\n description: 'The commentary that was added.',\n }),\n }),\n Schema.Void.annotations({\n description: 'Function did not find anything to comment on.',\n }),\n ),\n types: [Game.Game, Chess.State, Markdown.Document, Text.Text, HasSubject.HasSubject, Collection.Collection],\n services: [AiService.AiService, Database.Service],\n});\n\nexport default Commentary.pipe(\n Operation.withHandler(\n Effect.fnUntraced(\n function* ({ game: gameRef }) {\n // Load the game and its Chess variant state.\n log.info('load game', { gameRef });\n const { game: chessGame, variant: chessState } = yield* GameUtil.loadGame(gameRef, Chess.State);\n\n // Load the chess position from PGN or FEN.\n const chess = new ChessJS();\n if (chessState.pgn) {\n chess.loadPgn(chessState.pgn);\n } else if (chessState.fen) {\n chess.load(chessState.fen);\n } else {\n log.info('Early return: no pgn or fen');\n return;\n }\n\n // Get the most recent move\n const history = chess.history({ verbose: true });\n if (history.length === 0) {\n throw new Error('No moves have been played yet');\n }\n const lastMove = history[history.length - 1];\n const moveNumber = Math.ceil(history.length / 2);\n const isWhiteMove = history.length % 2 === 1;\n const player = isWhiteMove ? 'White' : 'Black';\n const moveNotation = lastMove.san;\n\n // Generate AI commentary about the move\n const result = yield* new AiRequest.Request({\n observer: GenerationObserver.fromPrinter(new ConsolePrinter({ tag: 'chess-commentary' })),\n }).run({\n prompt:\n `Comment on this chess move as if you're commentating a live match for an audience:\\n\\n` +\n `Move ${moveNumber}: ${player} plays ${moveNotation} (${lastMove.from} to ${lastMove.to})${lastMove.captured ? `, capturing ${lastMove.captured}` : ''}\\n` +\n `Current position: ${chess.fen()}\\n` +\n `${chess.isCheck() ? 'The king is in check! ' : ''}` +\n `${chess.isCheckmate() ? 'CHECKMATE! ' : ''}` +\n `${chess.isStalemate() ? 'STALEMATE! ' : ''}` +\n `\\nGame so far:\\n${chess.pgn()}`,\n system: COMMENTARY_SYSTEM_PROMPT,\n history: [],\n });\n\n const commentaryText = Function.pipe(\n result,\n Array.findLast((msg) => msg.sender.role === 'assistant' && msg.blocks.some((block) => block._tag === 'text')),\n Option.flatMap((msg) =>\n Function.pipe(\n msg.blocks,\n Array.findLast((block) => block._tag === 'text'),\n Option.map((block) => block.text),\n ),\n ),\n Option.getOrThrowWith(() => new Error('No commentary generated')),\n );\n\n const commentary = `## Move ${moveNumber}: ${player} plays ${moveNotation}\\n\\n${commentaryText}\\n\\n`;\n log.info('commentary', { commentary });\n\n // TODO(wittjosiah): Functions currently don't support traversals.\n // const docs = yield* Database.query(\n // Query.select(Filter.id(chessGame.id)).targetOf(HasSubject.HasSubject).source(),\n // ).run.pipe(Effect.map((objects) => objects.filter((object) => Obj.instanceOf(Markdown.Document, object))));\n const docs = yield* Database.query(Filter.type(HasSubject.HasSubject)).run.pipe(\n Effect.map((relations) =>\n relations.filter((relation) => {\n // TODO(wittjosiah): This is a workaround for getTarget not handling deleted objects.\n try {\n log.info('relation', {\n source: Obj.getURI(Relation.getTarget(relation)),\n game: Obj.getURI(chessGame),\n });\n return Obj.getURI(Relation.getTarget(relation)) === Obj.getURI(chessGame);\n } catch {\n return false;\n }\n }),\n ),\n Effect.map((relations) =>\n relations\n .map((relation) => {\n // TODO(wittjosiah): This is a workaround for getSource not handling deleted objects.\n try {\n return Relation.getSource(relation);\n } catch {\n return undefined;\n }\n })\n .filter((source) => source !== undefined),\n ),\n Effect.map((sources) => {\n const docs = sources.filter((source) => Obj.instanceOf(Markdown.Document, source));\n log.info('docs', { sources, docs });\n return docs;\n }),\n );\n log.info('docs', { count: docs.length });\n\n let document: Markdown.Document;\n if (docs.length === 0) {\n // TODO(wittjosiah): Deploy fails if `SpaceProperties` schema is imported because its from `client-protocol`.\n const [properties] = yield* Database.query(Filter.type(DXN.make('org.dxos.type.spaceProperties'))).run;\n const rootCollectionRef = Annotation.get(properties, AppAnnotation.RootCollectionAnnotation).pipe(\n Option.getOrUndefined,\n );\n const rootCollection = rootCollectionRef\n ? yield* Database.load<Collection.Collection>(rootCollectionRef)\n : undefined;\n\n log.info('rootCollection', { rootCollection });\n\n // Create a new markdown document\n const gameName = chessGame.name || 'Chess Game';\n document = yield* Database.add(\n Markdown.make({\n name: `${gameName} Commentary`,\n content: `# ${gameName} Commentary\\n\\n${commentary}`,\n }),\n );\n\n const documentRef = Ref.make(document);\n if (rootCollection) {\n Obj.update(rootCollection, (rootCollection) => {\n rootCollection.objects.push(documentRef);\n });\n }\n\n // Create the HasSubject relation\n yield* Database.add(\n Relation.make(HasSubject.HasSubject, {\n [Relation.Source]: document,\n [Relation.Target]: chessGame,\n }),\n );\n } else {\n document = docs[0];\n\n // Load the text content and append the commentary\n const text = yield* Database.load(document.content);\n const accessor = Doc.createAccessor(text, ['content']);\n accessor.handle.change((doc: A.Doc<Text.Text>) => {\n A.splice(doc, accessor.path.slice(), text.content.length, 0, commentary);\n });\n }\n\n log.info('result', { documentId: Obj.getURI(document), commentary });\n\n yield* Database.flush();\n\n return {\n documentId: Obj.getURI(document),\n commentary,\n };\n },\n Effect.provide(\n Layer.mergeAll(\n AiService.model('com.anthropic.model.claude-haiku-4-5.default'),\n ToolResolverService.layerEmpty,\n ToolExecutionService.layerEmpty,\n Trace.writerLayerNoop,\n Database.notAvailable,\n Layer.succeed(Operation.Service, {\n invoke: () => Effect.die('Not available.'),\n schedule: () => Effect.die('Not available.'),\n invokePromise: async () => ({ error: new Error('Not available.') }),\n } as any),\n registryLayerNoop,\n ),\n ),\n ),\n ),\n);\n\nconst COMMENTARY_SYSTEM_PROMPT = trim`\n You are a professional chess commentator providing live commentary for a chess match.\n\n # Style\n - Write in an engaging, enthusiastic style as if commentating for a live audience\n - Be concise but informative (2-4 sentences)\n - Explain the strategic implications of the move\n - Note any tactical elements (captures, threats, checks)\n - Comment on the position and what it means for the game\n\n # Format\n - Write in plain text (no markdown formatting in the commentary itself)\n - Be natural and conversational\n - Use chess terminology appropriately but keep it accessible\n\n # Special Situations\n - If it's checkmate, express excitement about the conclusion\n - If it's check, note the pressure on the king\n - If a piece is captured, mention the material exchange\n - Comment on the development of pieces and control of key squares when relevant\n`;\n";
|
|
9
9
|
//#endregion
|
|
10
10
|
//#region src/templates/data-generator.ts?raw
|
|
11
11
|
var data_generator_default = "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { Expando, S, create, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport { randText } from 'https://esm.sh/@ngneat/falso@7.1.1?bundle=false';\n\nexport default defineFunction({\n key: 'org.dxos.script.data-generator',\n name: 'Data Generator',\n inputSchema: S.Struct({\n documentAmount: S.optional(S.Number),\n textSize: S.optional(S.Number),\n mutationAmount: S.optional(S.Number),\n waitAfterCreation: S.optional(S.Number),\n }),\n\n outputSchema: S.Struct({}),\n\n handler: async ({\n data: { documentAmount = 1, textSize = 10, mutationAmount = 0, waitAfterCreation = 10_000 },\n context: { space },\n }: any) => {\n space.db.graph.registry.add([Expando]);\n const result: Record<string, any> = {};\n const objects: Expando[] = [];\n\n // Create objects.\n for (let i = 0; i < documentAmount; i++) {\n const obj = space.db.add(\n create(Expando, {\n name: 'scriptGenerated',\n content: randText({ charCount: textSize }),\n }),\n );\n objects.push(obj);\n const objectResult: any = {};\n // Mutate the object.\n for (let i = 0; i < mutationAmount; i++) {\n obj.content = randText({ charCount: textSize });\n }\n objectResult.mutations = mutationAmount;\n objectResult.contentLength = obj.content.length;\n result[obj.id] = objectResult;\n }\n\n // Flush and wait for data to propagate.\n await space.db.flush();\n await new Promise((resolve) => setTimeout(resolve, waitAfterCreation));\n return { createdObjects: objects.length };\n },\n});\n";
|
|
@@ -17,16 +17,16 @@ var discord_default = "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimpo
|
|
|
17
17
|
var email_default = "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Appends a message to the end of a Document configured through a trigger.\n * Trigger must have a targetDocumentId field set in Meta.\n */\nexport default async ({ data: { bodyText }, context: { space } }: any) => {\n const { email, targetDocumentId: documentId } = JSON.parse(bodyText) as RequestPayload;\n\n const document = await space.db.query({ id: documentId }).first();\n\n const contentId = document.content['/'].split(':')[3];\n const documentContent = await space.db.query({ id: contentId }).first();\n const modifiedContent = [\n documentContent.content,\n '',\n '---',\n `**From:** ${email.from}`,\n `**Subject:** ${email.subject}`,\n `**Date:** ${email.created}`,\n '',\n email.body,\n ].join('\\n');\n\n await space.db.update({ id: contentId }, { content: modifiedContent });\n\n return new Response(JSON.stringify({ success: true }));\n};\n\ntype RequestPayload = {\n email: { from: string; subject: string; created: string; body: string };\n targetDocumentId: string;\n};\n";
|
|
18
18
|
//#endregion
|
|
19
19
|
//#region src/templates/forex-effect.ts?raw
|
|
20
|
-
var forex_effect_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as FetchHttpClient from '@effect/platform/FetchHttpClient';\nimport * as HttpClient from '@effect/platform/HttpClient';\nimport * as HttpClientRequest from '@effect/platform/HttpClientRequest';\nimport * as Effect from 'effect/Effect';\nimport * as Schedule from 'effect/Schedule';\nimport * as Schema from 'effect/Schema';\n\nimport
|
|
20
|
+
var forex_effect_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as FetchHttpClient from '@effect/platform/FetchHttpClient';\nimport * as HttpClient from '@effect/platform/HttpClient';\nimport * as HttpClientRequest from '@effect/platform/HttpClientRequest';\nimport * as Effect from 'effect/Effect';\nimport * as Schedule from 'effect/Schedule';\nimport * as Schema from 'effect/Schema';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport { DXN } from '@dxos/keys';\n\nconst ForexEffect = Operation.make({\n meta: {\n key: DXN.make('org.dxos.script.forexEffect'),\n name: 'Forex Effect',\n description: 'Returns the exchange rate between two currencies.',\n },\n input: Schema.Struct({\n from: Schema.String.annotations({ description: 'The source currency' }),\n to: Schema.String.annotations({ description: 'The target currency' }),\n }),\n output: Schema.Any,\n});\n\nexport default ForexEffect.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ from: rawFrom, to: rawTo }) {\n const from = rawFrom.toUpperCase();\n const to = rawTo.toUpperCase();\n const json: any = yield* HttpClientRequest.get(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`).pipe(\n HttpClient.execute,\n Effect.flatMap((response) => response.json),\n Effect.timeout('5 seconds'),\n Effect.retry(Schedule.exponential(1_000).pipe(Schedule.compose(Schedule.recurs(3)))),\n Effect.scoped,\n );\n\n const rate = json?.data?.rates?.[to];\n if (rate == null) {\n return yield* Effect.fail(new Error(`No rate found for ${from} -> ${to}`));\n }\n\n return rate.toString();\n }, Effect.provide(FetchHttpClient.layer)),\n ),\n);\n";
|
|
21
21
|
//#endregion
|
|
22
22
|
//#region src/templates/forex.ts?raw
|
|
23
|
-
var forex_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport
|
|
23
|
+
var forex_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport { DXN } from '@dxos/keys';\n\nconst Forex = Operation.make({\n meta: {\n key: DXN.make('org.dxos.script.forex'),\n name: 'Forex',\n description: 'Returns the exchange rate between two currencies.',\n },\n input: Schema.Struct({\n from: Schema.String.annotations({ description: 'The source currency' }),\n to: Schema.String.annotations({ description: 'The target currency' }),\n }),\n output: Schema.Any,\n});\n\nexport default Forex.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ from: rawFrom, to: rawTo }) {\n const from = rawFrom.toUpperCase();\n const to = rawTo.toUpperCase();\n const res = yield* Effect.promise(() => fetch(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`));\n const {\n data: { rates },\n } = yield* Effect.promise(() => res.json());\n\n return rates[to].toString();\n }),\n ),\n);\n";
|
|
24
24
|
//#endregion
|
|
25
25
|
//#region src/templates/gmail.ts?raw
|
|
26
26
|
var gmail_default = "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { EchoObject, EntityId, Filter, S, create, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n // @ts-ignore\n} from 'https://esm.sh/@effect/platform@0.89.0?deps=effect@3.17.0&bundle=false';\n// @ts-ignore\nimport { format, subDays } from 'https://esm.sh/date-fns@3.3.1?bundle=false';\n// @ts-ignore\nimport * as Chunk from 'https://esm.sh/effect@3.17.0/Chunk?bundle=false';\n// @ts-ignore\nimport * as Effect from 'https://esm.sh/effect@3.17.0/Effect?bundle=false';\n// @ts-ignore\nimport * as Function from 'https://esm.sh/effect@3.17.0/Function?bundle=false';\n// @ts-ignore\nimport * as Ref from 'https://esm.sh/effect@3.17.0/Ref?bundle=false';\n// @ts-ignore\nimport * as Schedule from 'https://esm.sh/effect@3.17.0/Schedule?bundle=false';\n// @ts-ignore\nimport * as Stream from 'https://esm.sh/effect@3.17.0/Stream?bundle=false';\n\nexport default defineFunction({\n key: 'org.dxos.script.gmail',\n name: 'Gmail',\n inputSchema: S.Struct({\n mailboxId: S.String,\n userId: S.optional(S.String).pipe(S.withDecodingDefault(() => 'me')),\n after: S.optional(S.Union(S.Number, S.String)).pipe(\n S.withDecodingDefault(() => format(subDays(new Date(), 30), 'yyyy-MM-dd')),\n ),\n pageSize: S.optional(S.Number).pipe(S.withDecodingDefault(() => 100)),\n // TODO(wittjosiah): Remove. This is used to provide a terminal for a cron trigger.\n tick: S.optional(S.String),\n }),\n\n outputSchema: S.Struct({\n newMessages: S.Number,\n }),\n\n handler: ({ context: { space }, data: { mailboxId, userId, after, pageSize } }: any) =>\n Effect.gen(function* () {\n const { token } = yield* Effect.tryPromise({\n try: () => space.db.query(Filter.typename('org.dxos.type.accessToken', { source: 'gmail.com' })).first(),\n catch: (e: any) => e,\n });\n\n // NOTE: Google API bundles size is v. large and caused runtime issues.\n const makeRequest = (url: string) =>\n Function.pipe(\n url,\n HttpClientRequest.get,\n HttpClientRequest.setHeaders({ Authorization: `Bearer ${token}`, Accept: 'application/json' }),\n HttpClient.execute,\n Effect.flatMap((res: any) => res.json),\n Effect.timeout('1 second'),\n Effect.retry(Schedule.exponential(1000).pipe(Schedule.compose(Schedule.recurs(3)))),\n Effect.scoped,\n );\n\n const listMessages = (userId: string, q: string, pageSize: number, pageToken: string | null) =>\n makeRequest(getUrl(userId, undefined, { q, pageSize, pageToken }));\n\n const getMessage = (userId: string, messageId: string) => makeRequest(getUrl(userId, messageId));\n\n const mailbox = yield* Effect.tryPromise({\n try: () => space.db.query({ id: mailboxId }).first(),\n catch: (e: any) => e,\n });\n const { objects } = yield* Effect.tryPromise({\n try: () => space.queues.queryQueue(mailbox.queue.uri),\n catch: (e: any) => e,\n });\n const newMessages = yield* Ref.make([]);\n const nextPage = yield* Ref.make(null);\n\n do {\n const last = objects.at(-1);\n const q = last\n ? `in:inbox after:${Math.floor(new Date(last.created).getTime() / 1000)}`\n : `in:inbox after:${after}`;\n const pageToken = yield* Ref.get(nextPage);\n const { messages, nextPageToken } = yield* listMessages(userId, q, pageSize, pageToken);\n yield* Ref.update(nextPage, () => nextPageToken);\n for (const message of messages) {\n const messageDetails = yield* getMessage(userId, message.id);\n const created = new Date(parseInt(messageDetails.internalDate)).toISOString();\n const from = messageDetails.payload.headers.find((h: any) => h.name === 'From');\n const sender = from && parseFromHeader(from.value);\n // TODO(wittjosiah): Improve parsing of email contents.\n const content =\n messageDetails.payload.body?.data ??\n messageDetails.payload.parts?.find((p: any) => p.mimeType === 'text/plain')?.body.data;\n // Skip the message if content or sender is missing.\n // Skip the message if it's the same as the last message.\n // TODO(wittjosiah): This comparison should be done via foreignId probably.\n if (!content || !sender || created === last?.created) {\n continue;\n }\n const subject = messageDetails.payload.headers.find((h: any) => h.name === 'Subject')?.value;\n const object = create(MessageType, {\n id: EntityId.random(),\n created,\n sender,\n blocks: [\n {\n _tag: 'text',\n text: Buffer.from(content, 'base64').toString('utf-8'),\n },\n ],\n properties: {\n subject,\n threadId: message.threadId,\n },\n });\n // TODO(wittjosiah): Set foreignId in object meta.\n yield* Ref.update(newMessages, (n: any) => [object, ...n]);\n }\n } while (yield* Ref.get(nextPage));\n\n const queueMessages = yield* Ref.get(newMessages);\n if (queueMessages.length > 0) {\n yield* Function.pipe(\n queueMessages,\n Stream.fromIterable,\n Stream.grouped(10),\n Stream.flatMap((batch: any) =>\n Effect.tryPromise({\n try: () => space.queues.insertIntoQueue(mailbox.queue.uri, Chunk.toReadonlyArray(batch)),\n catch: (e: any) => e,\n }),\n ),\n Stream.runDrain,\n );\n }\n\n return { newMessages: queueMessages.length };\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n});\n\nconst getUrl = (userId: string, messageId?: string, params?: Record<string, any>) => {\n const api = new URL(\n [`https://gmail.googleapis.com/gmail/v1/users/${userId}/messages`, messageId].filter(Boolean).join('/'),\n );\n Object.entries(params ?? {})\n .filter(([_, value]) => value != null)\n .forEach(([key, value]) => api.searchParams.set(key, value));\n return api.toString();\n};\n\n/**\n * Parses an email string in the format \"Name <email@example.com>\" into separate name and email components.\n */\nconst parseFromHeader = (value: string): { name?: string; email: string } | undefined => {\n const EMAIL_REGEX = /^([^<]+?)\\s*<([^>]+@[^>]+)>$/;\n const removeOuterQuotes = (str: string) => str.replace(/^['\"]|['\"]$/g, '');\n const match = value.match(EMAIL_REGEX);\n if (match) {\n const [, name, email] = match;\n return {\n name: removeOuterQuotes(name.trim()),\n email: email.trim(),\n };\n }\n};\n\n//\n// Schemas\n// TODO(wittjosiah): These schemas should be imported from @dxos/schema.\n//\n\nconst ActorRole = S.Literal('user', 'assistant');\ntype ActorRole = S.Schema.Type<typeof ActorRole>;\n\nconst ActorSchema = S.Struct({\n identityKey: S.optional(S.String),\n email: S.optional(S.String),\n name: S.optional(S.String),\n role: S.optional(ActorRole),\n});\n\nconst Base = S.Struct({\n pending: S.optional(S.Boolean),\n});\ntype Base = S.Schema.Type<typeof Base>;\nconst Text = S.TaggedStruct('text', {\n mimeType: S.optional(S.String),\n text: S.String,\n ...Base.fields,\n}).pipe(S.mutable);\ninterface Text extends S.Schema.Type<typeof Text> {}\n\nconst MessageType = S.Struct({\n id: EntityId,\n created: S.String.annotations({\n description: 'ISO date string when the message was sent.',\n }),\n sender: ActorSchema.annotations({\n description: 'Identity of the message sender.',\n }),\n blocks: S.Array(Text).annotations({\n description: 'Contents of the message.',\n }),\n properties: S.optional(\n S.mutable(\n S.Record({ key: S.String, value: S.Any }).annotations({\n description: 'Custom properties for specific message types (e.g. attention context, email subject, etc.).',\n }),\n ),\n ),\n}).pipe(\n EchoObject({\n typename: 'org.dxos.type.message',\n version: '0.1.0',\n }),\n);\ntype MessageType = S.Schema.Type<typeof MessageType>;\n";
|
|
27
27
|
//#endregion
|
|
28
28
|
//#region src/templates/ping.ts?raw
|
|
29
|
-
var ping_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport
|
|
29
|
+
var ping_default = "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport { DXN } from '@dxos/keys';\n\nconst Ping = Operation.make({\n meta: {\n key: DXN.make('org.dxos.script.ping'),\n name: 'Ping',\n },\n input: Schema.Any,\n output: Schema.Any,\n});\n\nexport default Ping.pipe(\n Operation.withHandler(\n Effect.fn(function* (data) {\n return data;\n }),\n ),\n);\n";
|
|
30
30
|
//#endregion
|
|
31
31
|
//#region src/templates/index.ts
|
|
32
32
|
var removeHeader = (str) => str.split("\n").slice(4).join("\n");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { u as Update } from "./chunk-functions.mjs";
|
|
2
|
-
import { Operation } from "@dxos/compute";
|
|
3
2
|
import { Database, Obj } from "@dxos/echo";
|
|
3
|
+
import * as Operation from "@dxos/compute/Operation";
|
|
4
4
|
import { Doc, applyEdits } from "@dxos/echo-doc";
|
|
5
5
|
import * as Effect from "effect/Effect";
|
|
6
6
|
//#region src/skills/functions/update.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-update.mjs","names":[],"sources":["../../src/skills/functions/update.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport
|
|
1
|
+
{"version":3,"file":"chunk-update.mjs","names":[],"sources":["../../src/skills/functions/update.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as Operation from '@dxos/compute/Operation';\nimport type * as Script from '@dxos/compute/Script';\nimport { Database, Obj } from '@dxos/echo';\nimport { Doc, applyEdits } from '@dxos/echo-doc';\n\nimport { Update } from './definitions';\n\nexport default Update.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ function: fn, name, description, edits }) {\n const loaded = yield* Database.load(fn);\n if (!loaded.source) {\n return yield* Effect.fail(new Error('Function has no source script.'));\n }\n\n const script = (yield* Database.load(loaded.source)) as Script.Script;\n if (name !== undefined || description !== undefined) {\n Obj.update(script, (script) => {\n if (name !== undefined) {\n script.name = name;\n }\n if (description !== undefined) {\n script.description = description;\n }\n });\n }\n\n if (edits && edits.length > 0) {\n const text = yield* Database.load(script.source);\n const accessor = Doc.createAccessor(text, ['content']);\n applyEdits(accessor, edits);\n\n Obj.update(script, (script) => {\n script.changed = true;\n });\n }\n\n return {\n function: Obj.getURI(loaded),\n };\n }),\n ),\n);\n"],"mappings":";;;;;;AAaA,IAAA,iBAAe,OAAO,KACpB,UAAU,YACR,OAAO,GAAG,WAAW,EAAE,UAAU,IAAI,MAAM,aAAa,SAAS;CAC/D,MAAM,SAAS,OAAO,SAAS,KAAK,EAAE;CACtC,IAAI,CAAC,OAAO,QACV,OAAO,OAAO,OAAO,qBAAK,IAAI,MAAM,gCAAgC,CAAC;CAGvE,MAAM,SAAU,OAAO,SAAS,KAAK,OAAO,MAAM;CAClD,IAAI,SAAS,KAAA,KAAa,gBAAgB,KAAA,GACxC,IAAI,OAAO,SAAS,WAAW;EAC7B,IAAI,SAAS,KAAA,GACX,OAAO,OAAO;EAEhB,IAAI,gBAAgB,KAAA,GAClB,OAAO,cAAc;CAEzB,CAAC;CAGH,IAAI,SAAS,MAAM,SAAS,GAAG;EAC7B,MAAM,OAAO,OAAO,SAAS,KAAK,OAAO,MAAM;EAE/C,WADiB,IAAI,eAAe,MAAM,CAAC,SAAS,CACzC,GAAU,KAAK;EAE1B,IAAI,OAAO,SAAS,WAAW;GAC7B,OAAO,UAAU;EACnB,CAAC;CACH;CAEA,OAAO,EACL,UAAU,IAAI,OAAO,MAAM,EAC7B;AACF,CAAC,CACH,CACF"}
|
package/dist/lib/chunk-util.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Operation } from "@dxos/compute";
|
|
2
1
|
import { Obj, Ref } from "@dxos/echo";
|
|
2
|
+
import * as Operation from "@dxos/compute/Operation";
|
|
3
3
|
import { getInvocationUrl, getUserFunctionIdInMetadata } from "@dxos/compute-runtime";
|
|
4
4
|
import { Context } from "@dxos/context";
|
|
5
5
|
import { FunctionsServiceClient, incrementSemverPatch } from "@dxos/edge-compute";
|
|
@@ -32,7 +32,7 @@ var deployScript = async ({ script, client, space, fn, existingFunctionId }) =>
|
|
|
32
32
|
const storedFunction = createOrUpdateFunctionInSpace(space, fn, script, await FunctionsServiceClient.fromClient(client).deploy(Context.default(void 0, {
|
|
33
33
|
"~LogMeta": "~LogMeta",
|
|
34
34
|
F: __dxlog_file$1,
|
|
35
|
-
L:
|
|
35
|
+
L: 61
|
|
36
36
|
}), {
|
|
37
37
|
ownerUri: identity.did,
|
|
38
38
|
version: fn ? incrementSemverPatch(Obj.getMeta(fn).version ?? "0.0.0") : "0.0.1",
|
|
@@ -52,7 +52,7 @@ var deployScript = async ({ script, client, space, fn, existingFunctionId }) =>
|
|
|
52
52
|
log.catch(err, void 0, {
|
|
53
53
|
"~LogMeta": "~LogMeta",
|
|
54
54
|
F: __dxlog_file$1,
|
|
55
|
-
L:
|
|
55
|
+
L: 77,
|
|
56
56
|
S: void 0
|
|
57
57
|
});
|
|
58
58
|
return {
|
|
@@ -98,28 +98,28 @@ var updateFunctionMetadata = (script, storedFunction, meta, functionId) => {
|
|
|
98
98
|
else log.verbose("no description in function metadata", { functionId }, {
|
|
99
99
|
"~LogMeta": "~LogMeta",
|
|
100
100
|
F: __dxlog_file,
|
|
101
|
-
L:
|
|
101
|
+
L: 50,
|
|
102
102
|
S: void 0
|
|
103
103
|
});
|
|
104
104
|
if (meta.inputSchema) storedFunction.inputSchema = meta.inputSchema;
|
|
105
105
|
else log.verbose("no input schema in function metadata", { functionId }, {
|
|
106
106
|
"~LogMeta": "~LogMeta",
|
|
107
107
|
F: __dxlog_file,
|
|
108
|
-
L:
|
|
108
|
+
L: 56,
|
|
109
109
|
S: void 0
|
|
110
110
|
});
|
|
111
111
|
if (meta.outputSchema) storedFunction.outputSchema = meta.outputSchema;
|
|
112
112
|
else log.verbose("no output schema in function metadata", { functionId }, {
|
|
113
113
|
"~LogMeta": "~LogMeta",
|
|
114
114
|
F: __dxlog_file,
|
|
115
|
-
L:
|
|
115
|
+
L: 62,
|
|
116
116
|
S: void 0
|
|
117
117
|
});
|
|
118
118
|
if (meta.key) Obj.getMeta(storedFunction).key = meta.key;
|
|
119
119
|
else log.verbose("no key in function metadata", { functionId }, {
|
|
120
120
|
"~LogMeta": "~LogMeta",
|
|
121
121
|
F: __dxlog_file,
|
|
122
|
-
L:
|
|
122
|
+
L: 68,
|
|
123
123
|
S: void 0
|
|
124
124
|
});
|
|
125
125
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-util.mjs","names":[],"sources":["../../src/util/deploy.ts","../../src/util/functions.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Client } from '@dxos/client';\nimport {
|
|
1
|
+
{"version":3,"file":"chunk-util.mjs","names":[],"sources":["../../src/util/deploy.ts","../../src/util/functions.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Client } from '@dxos/client';\nimport { getUserFunctionIdInMetadata } from '@dxos/compute-runtime';\nimport * as Operation from '@dxos/compute/Operation';\nimport * as Script from '@dxos/compute/Script';\nimport { Context } from '@dxos/context';\nimport { Obj, Ref } from '@dxos/echo';\nimport { FunctionsServiceClient, incrementSemverPatch } from '@dxos/edge-compute';\nimport { bundleFunction } from '@dxos/edge-compute/bundler';\nimport { log } from '@dxos/log';\nimport { FunctionRuntimeKind } from '@dxos/protocols';\nimport { type Space } from '@dxos/react-client/echo';\n\nexport const isScriptDeployed = ({ script, fn }: { script: Script.Script; fn: any }): boolean => {\n const existingFunctionId = fn && getUserFunctionIdInMetadata(Obj.getMeta(fn));\n return Boolean(existingFunctionId) && !script.changed;\n};\n\ntype DeployScriptProps = {\n script: Script.Script;\n client: Client;\n space: Space;\n fn?: Operation.PersistentOperation;\n existingFunctionId?: string;\n};\n\ntype DeployScriptResult = { success: boolean; error?: Error; functionId?: string };\n\n/**\n * Deploy a script to a space, handling bundling and uploading to the FaaS infrastructure.\n */\nexport const deployScript = async ({\n script,\n client,\n space,\n fn,\n existingFunctionId,\n}: DeployScriptProps): Promise<DeployScriptResult> => {\n const validationError = validateDeployInputs(script, space);\n if (validationError) {\n return { success: false, error: validationError };\n }\n\n const identity = client.halo.identity.get();\n if (!identity) {\n return { success: false, error: new Error('Identity not available.') };\n }\n\n try {\n const buildResult = await bundleFunction({\n source: script.source!.target!.content,\n });\n if ('error' in buildResult) {\n throw buildResult.error || new Error('Bundle creation failed');\n }\n\n const functionsServiceClient = FunctionsServiceClient.fromClient(client);\n const newFunction = await functionsServiceClient.deploy(Context.default(), {\n ownerUri: identity.did,\n version: fn ? incrementSemverPatch(Obj.getMeta(fn).version ?? '0.0.0') : '0.0.1',\n functionId: existingFunctionId,\n entryPoint: buildResult.entryPoint,\n assets: buildResult.assets,\n runtime: FunctionRuntimeKind.enums.WORKER_LOADER,\n });\n\n const storedFunction = createOrUpdateFunctionInSpace(space, fn, script, newFunction);\n Obj.update(script, (script) => {\n script.changed = false;\n });\n\n return { success: true, functionId: getUserFunctionIdInMetadata(Obj.getMeta(storedFunction)) };\n } catch (err: any) {\n log.catch(err);\n return { success: false, error: err };\n }\n};\n\n/**\n * Validate inputs for script deployment.\n */\nconst validateDeployInputs = (script: Script.Script, space: Space): Error | null => {\n if (!script.source || !space) {\n return new Error('Script source or space not available');\n }\n return null;\n};\n\nconst createOrUpdateFunctionInSpace = (\n space: Space,\n fn: Operation.PersistentOperation | undefined,\n script: Script.Script,\n newFunction: Operation.PersistentOperation,\n): Operation.PersistentOperation => {\n if (fn) {\n Operation.setFrom(fn, newFunction);\n return fn;\n } else {\n Obj.update(newFunction, (newFunction) => {\n newFunction.source = Ref.make(script);\n });\n return space.db.add(newFunction);\n }\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { getUserFunctionIdInMetadata } from '@dxos/compute-runtime';\nimport { getInvocationUrl } from '@dxos/compute-runtime';\nimport type * as Operation from '@dxos/compute/Operation';\nimport * as Script from '@dxos/compute/Script';\nimport { Obj } from '@dxos/echo';\nimport { type PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\n\n/**\n * Get the function URL for a given script and client configuration\n */\nexport const getFunctionUrl = ({\n script,\n fn,\n edgeUrl,\n}: {\n script: Script.Script;\n fn: any;\n edgeUrl: string;\n}): string | undefined => {\n const spaceId = Obj.getDatabase(script)?.spaceId;\n const existingFunctionId = fn && getUserFunctionIdInMetadata(Obj.getMeta(fn));\n\n if (!existingFunctionId) {\n return undefined;\n }\n\n return getInvocationUrl(existingFunctionId, edgeUrl, {\n spaceId,\n });\n};\n\nexport const updateFunctionMetadata = (\n script: Script.Script,\n storedFunction: Operation.PersistentOperation,\n meta: any,\n functionId: string,\n) => {\n Obj.update(storedFunction, (storedFunction) => {\n if (script.description !== undefined && script.description.trim() !== '') {\n storedFunction.description = script.description;\n } else if (meta.description) {\n storedFunction.description = meta.description;\n } else {\n log.verbose('no description in function metadata', { functionId });\n }\n\n if (meta.inputSchema) {\n storedFunction.inputSchema = meta.inputSchema;\n } else {\n log.verbose('no input schema in function metadata', { functionId });\n }\n\n if (meta.outputSchema) {\n storedFunction.outputSchema = meta.outputSchema;\n } else {\n log.verbose('no output schema in function metadata', { functionId });\n }\n\n if (meta.key) {\n Obj.getMeta(storedFunction).key = meta.key;\n } else {\n log.verbose('no key in function metadata', { functionId });\n }\n });\n};\n\nexport const getAccessCredential = (identityKey: PublicKey): Credential => {\n return {\n issuer: identityKey,\n issuanceDate: new Date(),\n subject: {\n id: identityKey,\n assertion: {\n '@type': 'dxos.halo.credentials.ServiceAccess',\n 'serverName': 'hub.dxos.network',\n 'serverKey': identityKey,\n identityKey,\n 'capabilities': ['composer:beta'],\n },\n },\n };\n};\n"],"mappings":"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"}
|
package/dist/lib/components.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as Compiler } from "./chunk-compiler.mjs";
|
|
2
|
-
import { arrayMove, isNonNullable } from "@dxos/util";
|
|
3
2
|
import { Obj } from "@dxos/echo";
|
|
4
3
|
import { meta } from "#meta";
|
|
4
|
+
import { arrayMove, isNonNullable } from "@dxos/util";
|
|
5
5
|
import { log } from "@dxos/log";
|
|
6
6
|
import { forwardRef, useCallback, useId, useMemo, useRef, useState } from "react";
|
|
7
7
|
import { Avatar, DropdownMenu, ElevationProvider, Icon, IconButton, Input, ScrollArea, Toolbar, composable, composableProps, useAsyncEffect, useThemeContext, useTranslation } from "@dxos/react-ui";
|
|
@@ -430,7 +430,8 @@ var ScriptToolbar = composable(({ script, attendableId, role, state, ...props },
|
|
|
430
430
|
attendableId,
|
|
431
431
|
children: /* @__PURE__ */ jsx(Menu.Toolbar, {
|
|
432
432
|
...composableProps(props),
|
|
433
|
-
ref: forwardedRef
|
|
433
|
+
ref: forwardedRef,
|
|
434
|
+
children: /* @__PURE__ */ jsx(Menu.Items, {})
|
|
434
435
|
})
|
|
435
436
|
})
|
|
436
437
|
});
|
|
@@ -1 +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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"}
|
|
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';\n\nimport type * as Notebook from '../../types/Notebook';\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';\n\nimport { type ComputeGraph } from '../../notebook';\nimport type * as Notebook from '../../types/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';\n\nimport type * as Notebook from '../../types/Notebook';\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 * as Script from '@dxos/compute/Script';\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.Items />\n </Menu.Toolbar>\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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"}
|