@dxos/plugin-assistant 0.8.3-main.7f5a14c → 0.8.3-staging.0fa589b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/dist/lib/browser/{AssistantDialog-YCPMFK7Y.mjs → AssistantDialog-MQOOR364.mjs} +5 -5
  2. package/dist/lib/browser/{BlueprintContainer-4MEK52NT.mjs → BlueprintContainer-AT5Y7EXG.mjs} +145 -28
  3. package/dist/lib/browser/BlueprintContainer-AT5Y7EXG.mjs.map +7 -0
  4. package/dist/lib/browser/{ChatContainer-RYFYYEWI.mjs → ChatContainer-C2NEAS3A.mjs} +5 -5
  5. package/dist/lib/browser/{ai-client-MTCTMJ5N.mjs → ai-client-MK2ZZII2.mjs} +6 -6
  6. package/dist/lib/browser/ai-client-MK2ZZII2.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-builder-DBCVARVI.mjs → app-graph-builder-E4H5DCOJ.mjs} +35 -22
  8. package/dist/lib/browser/app-graph-builder-E4H5DCOJ.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-ZVHA24BL.mjs → chunk-AAOKC2JN.mjs} +10 -8
  10. package/dist/lib/browser/{chunk-ZVHA24BL.mjs.map → chunk-AAOKC2JN.mjs.map} +3 -3
  11. package/dist/lib/browser/{chunk-WFZ4EPPI.mjs → chunk-BI6AHRNJ.mjs} +6 -6
  12. package/dist/lib/browser/{chunk-WFZ4EPPI.mjs.map → chunk-BI6AHRNJ.mjs.map} +1 -1
  13. package/dist/lib/browser/{chunk-DLWFPGZE.mjs → chunk-JO4W3MF7.mjs} +6 -6
  14. package/dist/lib/browser/{chunk-DLWFPGZE.mjs.map → chunk-JO4W3MF7.mjs.map} +3 -3
  15. package/dist/lib/browser/chunk-MEGMOFJB.mjs +16 -0
  16. package/dist/lib/browser/{chunk-3TIEETB2.mjs → chunk-UE3IZ4PN.mjs} +1 -1
  17. package/dist/lib/browser/{chunk-3TIEETB2.mjs.map → chunk-UE3IZ4PN.mjs.map} +1 -1
  18. package/dist/lib/browser/index.mjs +66 -23
  19. package/dist/lib/browser/index.mjs.map +4 -4
  20. package/dist/lib/browser/{intent-resolver-ID5NOIIJ.mjs → intent-resolver-3UICTGPM.mjs} +2 -2
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/{react-surface-OD23FVUD.mjs → react-surface-LXCNUSZN.mjs} +23 -6
  23. package/dist/lib/browser/react-surface-LXCNUSZN.mjs.map +7 -0
  24. package/dist/lib/browser/{settings-FUYUBGSQ.mjs → settings-XRHXVWGB.mjs} +2 -2
  25. package/dist/lib/browser/types/index.mjs +1 -1
  26. package/dist/lib/node/{AssistantDialog-B5YKJOAF.cjs → AssistantDialog-AN4Z6YUV.cjs} +9 -9
  27. package/dist/lib/node/{BlueprintContainer-VD6EIWH7.cjs → BlueprintContainer-NOWLDYCZ.cjs} +141 -26
  28. package/dist/lib/node/BlueprintContainer-NOWLDYCZ.cjs.map +7 -0
  29. package/dist/lib/node/{ChatContainer-WFLTSAFA.cjs → ChatContainer-VKYBQHUB.cjs} +9 -9
  30. package/dist/lib/node/{ai-client-3XNIFMJX.cjs → ai-client-7HNSMUMT.cjs} +9 -9
  31. package/dist/lib/node/ai-client-7HNSMUMT.cjs.map +7 -0
  32. package/dist/lib/node/{app-graph-builder-VEPLBTML.cjs → app-graph-builder-PPR5B5KU.cjs} +42 -29
  33. package/dist/lib/node/app-graph-builder-PPR5B5KU.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-BGRQNE3L.cjs → chunk-FUAGEO7Q.cjs} +9 -9
  35. package/dist/lib/node/{chunk-DXBAFX6M.cjs → chunk-IKZBMHSW.cjs} +11 -11
  36. package/dist/lib/node/{chunk-DXBAFX6M.cjs.map → chunk-IKZBMHSW.cjs.map} +1 -1
  37. package/dist/lib/node/{chunk-7TQAIKE2.cjs → chunk-LMDJEGZ2.cjs} +14 -12
  38. package/dist/lib/node/chunk-LMDJEGZ2.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-WR5L3TVB.cjs → chunk-NIDICM57.cjs} +18 -18
  40. package/dist/lib/node/{chunk-WR5L3TVB.cjs.map → chunk-NIDICM57.cjs.map} +3 -3
  41. package/dist/lib/node/{chunk-ZP732NHS.cjs → chunk-QGPWY6GW.cjs} +4 -4
  42. package/dist/lib/node/{chunk-ZP732NHS.cjs.map → chunk-QGPWY6GW.cjs.map} +1 -1
  43. package/dist/lib/node/index.cjs +118 -76
  44. package/dist/lib/node/index.cjs.map +4 -4
  45. package/dist/lib/node/{intent-resolver-SDO4YKJK.cjs → intent-resolver-QSWGTKON.cjs} +8 -8
  46. package/dist/lib/node/meta.json +1 -1
  47. package/dist/lib/node/{react-surface-FANQXIRI.cjs → react-surface-D3NBYRZ6.cjs} +40 -23
  48. package/dist/lib/node/react-surface-D3NBYRZ6.cjs.map +7 -0
  49. package/dist/lib/node/{settings-PXPIPYJN.cjs → settings-2JXLKYGE.cjs} +6 -6
  50. package/dist/lib/node/types/index.cjs +14 -14
  51. package/dist/lib/node/types/index.cjs.map +1 -1
  52. package/dist/lib/node-esm/{AssistantDialog-KPZZD7XC.mjs → AssistantDialog-6WEMLUPU.mjs} +5 -5
  53. package/dist/lib/node-esm/{BlueprintContainer-SVOKCRCP.mjs → BlueprintContainer-STOJAVML.mjs} +145 -28
  54. package/dist/lib/node-esm/BlueprintContainer-STOJAVML.mjs.map +7 -0
  55. package/dist/lib/node-esm/{ChatContainer-WSMKUGS6.mjs → ChatContainer-3MVBTUJN.mjs} +5 -5
  56. package/dist/lib/node-esm/{ai-client-YIP44I4D.mjs → ai-client-XGZBJ6BE.mjs} +6 -6
  57. package/dist/lib/node-esm/ai-client-XGZBJ6BE.mjs.map +7 -0
  58. package/dist/lib/node-esm/{app-graph-builder-WJXDXLBQ.mjs → app-graph-builder-3SY5MBIK.mjs} +35 -22
  59. package/dist/lib/node-esm/app-graph-builder-3SY5MBIK.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-34EX6E5Q.mjs +18 -0
  61. package/dist/lib/node-esm/{chunk-VXGO6Q2L.mjs → chunk-3UEZLJ2V.mjs} +1 -1
  62. package/dist/lib/node-esm/{chunk-VXGO6Q2L.mjs.map → chunk-3UEZLJ2V.mjs.map} +1 -1
  63. package/dist/lib/node-esm/{chunk-24LIHQST.mjs → chunk-J6UXXZGJ.mjs} +10 -8
  64. package/dist/lib/node-esm/{chunk-24LIHQST.mjs.map → chunk-J6UXXZGJ.mjs.map} +3 -3
  65. package/dist/lib/node-esm/{chunk-TTSMEWR6.mjs → chunk-OD574YIU.mjs} +6 -6
  66. package/dist/lib/node-esm/{chunk-TTSMEWR6.mjs.map → chunk-OD574YIU.mjs.map} +3 -3
  67. package/dist/lib/node-esm/{chunk-QFX6SFFZ.mjs → chunk-UCOFKNKN.mjs} +6 -6
  68. package/dist/lib/node-esm/{chunk-QFX6SFFZ.mjs.map → chunk-UCOFKNKN.mjs.map} +1 -1
  69. package/dist/lib/node-esm/index.mjs +66 -23
  70. package/dist/lib/node-esm/index.mjs.map +4 -4
  71. package/dist/lib/node-esm/{intent-resolver-75REJDDQ.mjs → intent-resolver-E6MXTYAU.mjs} +2 -2
  72. package/dist/lib/node-esm/meta.json +1 -1
  73. package/dist/lib/node-esm/{react-surface-NAN4SDCE.mjs → react-surface-7HA5EDWY.mjs} +23 -6
  74. package/dist/lib/node-esm/react-surface-7HA5EDWY.mjs.map +7 -0
  75. package/dist/lib/node-esm/{settings-JHMKX3UV.mjs → settings-5IAY6BT4.mjs} +2 -2
  76. package/dist/lib/node-esm/types/index.mjs +1 -1
  77. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/ai-client.d.ts +2 -2
  79. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  82. package/dist/types/src/capabilities/index.d.ts +1 -1
  83. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  84. package/dist/types/src/components/BlueprintContainer.d.ts.map +1 -1
  85. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -1
  86. package/dist/types/src/events.d.ts +4 -0
  87. package/dist/types/src/events.d.ts.map +1 -0
  88. package/dist/types/src/hooks/processor.d.ts +3 -3
  89. package/dist/types/src/hooks/useMessageQueue.d.ts +2 -2
  90. package/dist/types/src/index.d.ts +1 -0
  91. package/dist/types/src/index.d.ts.map +1 -1
  92. package/dist/types/src/queue-logger.d.ts +11 -0
  93. package/dist/types/src/queue-logger.d.ts.map +1 -0
  94. package/dist/types/src/translations.d.ts +75 -11
  95. package/dist/types/src/translations.d.ts.map +1 -1
  96. package/dist/types/src/types/chat.d.ts +12 -9
  97. package/dist/types/src/types/chat.d.ts.map +1 -1
  98. package/dist/types/src/types/service.d.ts +51 -102
  99. package/dist/types/src/types/service.d.ts.map +1 -1
  100. package/dist/types/src/types/template.d.ts +3 -23
  101. package/dist/types/src/types/template.d.ts.map +1 -1
  102. package/dist/types/src/types/types.d.ts +5 -5
  103. package/package.json +70 -69
  104. package/src/AssistantPlugin.tsx +26 -3
  105. package/src/capabilities/ai-client.ts +4 -4
  106. package/src/capabilities/app-graph-builder.ts +34 -22
  107. package/src/capabilities/capabilities.ts +2 -2
  108. package/src/capabilities/react-surface.tsx +16 -0
  109. package/src/components/BlueprintContainer.tsx +10 -22
  110. package/src/components/PromptSettings.tsx +1 -1
  111. package/src/components/Thread/Thread.stories.tsx +19 -27
  112. package/src/components/Thread/ThreadContainer.stories.tsx +5 -5
  113. package/src/components/Thread/ThreadContainer.tsx +1 -1
  114. package/src/components/Thread/reducer.ts +3 -3
  115. package/src/events.ts +11 -0
  116. package/src/hooks/processor.ts +4 -4
  117. package/src/index.ts +1 -0
  118. package/src/queue-logger.ts +125 -0
  119. package/src/stories/Query.stories.tsx +4 -4
  120. package/src/stories/Research.stories.tsx +11 -11
  121. package/src/stories/test-data.ts +4 -4
  122. package/src/testing/test-blueprint.ts +1 -1
  123. package/src/tools/openapi.test.ts +4 -4
  124. package/src/translations.ts +16 -4
  125. package/src/types/template.ts +11 -6
  126. package/dist/lib/browser/BlueprintContainer-4MEK52NT.mjs.map +0 -7
  127. package/dist/lib/browser/ai-client-MTCTMJ5N.mjs.map +0 -7
  128. package/dist/lib/browser/app-graph-builder-DBCVARVI.mjs.map +0 -7
  129. package/dist/lib/browser/chunk-AKYSTUBJ.mjs +0 -16
  130. package/dist/lib/browser/react-surface-OD23FVUD.mjs.map +0 -7
  131. package/dist/lib/node/BlueprintContainer-VD6EIWH7.cjs.map +0 -7
  132. package/dist/lib/node/ai-client-3XNIFMJX.cjs.map +0 -7
  133. package/dist/lib/node/app-graph-builder-VEPLBTML.cjs.map +0 -7
  134. package/dist/lib/node/chunk-7TQAIKE2.cjs.map +0 -7
  135. package/dist/lib/node/react-surface-FANQXIRI.cjs.map +0 -7
  136. package/dist/lib/node-esm/BlueprintContainer-SVOKCRCP.mjs.map +0 -7
  137. package/dist/lib/node-esm/ai-client-YIP44I4D.mjs.map +0 -7
  138. package/dist/lib/node-esm/app-graph-builder-WJXDXLBQ.mjs.map +0 -7
  139. package/dist/lib/node-esm/chunk-ZKTIHNT7.mjs +0 -18
  140. package/dist/lib/node-esm/react-surface-NAN4SDCE.mjs.map +0 -7
  141. /package/dist/lib/browser/{AssistantDialog-YCPMFK7Y.mjs.map → AssistantDialog-MQOOR364.mjs.map} +0 -0
  142. /package/dist/lib/browser/{ChatContainer-RYFYYEWI.mjs.map → ChatContainer-C2NEAS3A.mjs.map} +0 -0
  143. /package/dist/lib/browser/{chunk-AKYSTUBJ.mjs.map → chunk-MEGMOFJB.mjs.map} +0 -0
  144. /package/dist/lib/browser/{intent-resolver-ID5NOIIJ.mjs.map → intent-resolver-3UICTGPM.mjs.map} +0 -0
  145. /package/dist/lib/browser/{settings-FUYUBGSQ.mjs.map → settings-XRHXVWGB.mjs.map} +0 -0
  146. /package/dist/lib/node/{AssistantDialog-B5YKJOAF.cjs.map → AssistantDialog-AN4Z6YUV.cjs.map} +0 -0
  147. /package/dist/lib/node/{ChatContainer-WFLTSAFA.cjs.map → ChatContainer-VKYBQHUB.cjs.map} +0 -0
  148. /package/dist/lib/node/{chunk-BGRQNE3L.cjs.map → chunk-FUAGEO7Q.cjs.map} +0 -0
  149. /package/dist/lib/node/{intent-resolver-SDO4YKJK.cjs.map → intent-resolver-QSWGTKON.cjs.map} +0 -0
  150. /package/dist/lib/node/{settings-PXPIPYJN.cjs.map → settings-2JXLKYGE.cjs.map} +0 -0
  151. /package/dist/lib/node-esm/{AssistantDialog-KPZZD7XC.mjs.map → AssistantDialog-6WEMLUPU.mjs.map} +0 -0
  152. /package/dist/lib/node-esm/{ChatContainer-WSMKUGS6.mjs.map → ChatContainer-3MVBTUJN.mjs.map} +0 -0
  153. /package/dist/lib/node-esm/{chunk-ZKTIHNT7.mjs.map → chunk-34EX6E5Q.mjs.map} +0 -0
  154. /package/dist/lib/node-esm/{intent-resolver-75REJDDQ.mjs.map → intent-resolver-E6MXTYAU.mjs.map} +0 -0
  155. /package/dist/lib/node-esm/{settings-JHMKX3UV.mjs.map → settings-5IAY6BT4.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/react-surface.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Effect } from 'effect';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { Capabilities, contributes, createIntent, createSurface, useIntentDispatcher } from '@dxos/app-framework';\nimport { Blueprint } from '@dxos/assistant';\nimport { InvocationTraceContainer } from '@dxos/devtools';\nimport { Filter, type Key, Obj, Query } from '@dxos/echo';\nimport { SettingsStore } from '@dxos/local-storage';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId, getSpace, getTypename } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport {\n AssistantDialog,\n AssistantSettings,\n BlueprintContainer,\n ChatContainer,\n PromptSettings,\n TemplateContainer,\n} from '../components';\nimport { ASSISTANT_PLUGIN, ASSISTANT_DIALOG } from '../meta';\nimport { AIChatType, AssistantAction, type AssistantSettingsProps, CompanionTo, TemplateType } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${ASSISTANT_PLUGIN}/plugin-settings`,\n role: 'article',\n filter: (data): data is { subject: SettingsStore<AssistantSettingsProps> } =>\n data.subject instanceof SettingsStore && data.subject.prefix === ASSISTANT_PLUGIN,\n component: ({ data: { subject } }) => <AssistantSettings settings={subject.value} />,\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/chat`,\n role: 'article',\n filter: (data): data is { subject: AIChatType; variant: undefined } =>\n Obj.instanceOf(AIChatType, data.subject) && data.variant !== 'assistant-chat',\n component: ({ data, role }) => <ChatContainer role={role} chat={data.subject} />,\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/object-chat`,\n role: 'article',\n filter: (data): data is { companionTo: Obj.Any; subject: AIChatType | 'assistant-chat' } =>\n Obj.isObject(data.companionTo) &&\n (Obj.instanceOf(AIChatType, data.subject) || data.subject === 'assistant-chat'),\n component: ({ data, role }) => {\n const { dispatch } = useIntentDispatcher();\n const associatedArtifact = useMemo(\n () => ({\n id: fullyQualifiedId(data.companionTo),\n typename: getTypename(data.companionTo) ?? 'unknown',\n spaceId: (getSpace(data.companionTo)?.id ?? 'unknown') as Key.SpaceId,\n }),\n [data.companionTo],\n );\n\n // TODO(wittjosiah): Factor out to container.\n useEffect(() => {\n const timeout = setTimeout(async () => {\n const space = getSpace(data.companionTo);\n if (space && data.subject === 'assistant-chat') {\n const result = await space.db\n .query(Query.select(Filter.ids(data.companionTo.id)).targetOf(CompanionTo).source())\n .run();\n if (result.objects.length > 0) {\n return;\n }\n\n const program = Effect.gen(function* () {\n const { object } = yield* dispatch(createIntent(AssistantAction.CreateChat, { space }));\n yield* dispatch(createIntent(SpaceAction.AddObject, { object, target: space, hidden: true }));\n yield* dispatch(\n createIntent(SpaceAction.AddRelation, {\n space,\n schema: CompanionTo,\n source: object,\n target: data.companionTo,\n }),\n );\n });\n void Effect.runPromise(program);\n }\n });\n\n return () => clearTimeout(timeout);\n }, [data.subject]);\n\n if (data.subject === 'assistant-chat') {\n return null;\n }\n\n return <ChatContainer role={role} chat={data.subject} associatedArtifact={associatedArtifact} />;\n },\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/blueprint`,\n role: 'article',\n filter: (data): data is { subject: Blueprint } => Obj.instanceOf(Blueprint, data.subject),\n component: ({ data, role }) => <BlueprintContainer role={role} blueprint={data.subject} />,\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/companion/logs`,\n role: 'article',\n filter: (data): data is { companionTo: Blueprint } =>\n Obj.instanceOf(Blueprint, data.companionTo) && data.subject === 'logs',\n component: ({ data, role }) => {\n const space = getSpace(data.companionTo);\n return (\n <StackItem.Content role={role}>\n <InvocationTraceContainer space={space} target={data.companionTo} detailAxis='block' />\n </StackItem.Content>\n );\n },\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/template`,\n role: 'article',\n filter: (data): data is { subject: TemplateType } => Obj.instanceOf(TemplateType, data.subject),\n component: ({ data, role }) => <TemplateContainer role={role} template={data.subject} />,\n }),\n createSurface({\n id: ASSISTANT_DIALOG,\n role: 'dialog',\n filter: (data): data is { props: { chat: AIChatType } } => data.component === ASSISTANT_DIALOG,\n component: ({ data }) => <AssistantDialog {...data.props} />,\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/prompt-settings`,\n role: 'object-settings',\n filter: (data): data is { subject: TemplateType } => Obj.instanceOf(TemplateType, data.subject),\n component: ({ data }) => <PromptSettings template={data.subject} />,\n }),\n ]);\n"],
5
+ "mappings": "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",
6
+ "names": ["Effect", "React", "useEffect", "useMemo", "Capabilities", "contributes", "createIntent", "createSurface", "useIntentDispatcher", "Blueprint", "InvocationTraceContainer", "Filter", "Obj", "Query", "SettingsStore", "SpaceAction", "fullyQualifiedId", "getSpace", "getTypename", "StackItem", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "ASSISTANT_PLUGIN", "role", "filter", "data", "subject", "SettingsStore", "prefix", "component", "AssistantSettings", "settings", "value", "Obj", "instanceOf", "AIChatType", "variant", "ChatContainer", "chat", "isObject", "companionTo", "dispatch", "useIntentDispatcher", "associatedArtifact", "useMemo", "fullyQualifiedId", "typename", "getTypename", "spaceId", "getSpace", "useEffect", "timeout", "setTimeout", "space", "result", "db", "query", "Query", "select", "Filter", "ids", "targetOf", "CompanionTo", "source", "run", "objects", "length", "program", "Effect", "gen", "object", "createIntent", "AssistantAction", "CreateChat", "SpaceAction", "AddObject", "target", "hidden", "AddRelation", "schema", "runPromise", "clearTimeout", "Blueprint", "BlueprintContainer", "blueprint", "StackItem", "Content", "InvocationTraceContainer", "detailAxis", "TemplateType", "TemplateContainer", "template", "ASSISTANT_DIALOG", "AssistantDialog", "props", "PromptSettings"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AssistantSettingsSchema
3
- } from "./chunk-ZVHA24BL.mjs";
3
+ } from "./chunk-AAOKC2JN.mjs";
4
4
  import {
5
5
  meta
6
6
  } from "./chunk-XOZ7YMO3.mjs";
@@ -19,4 +19,4 @@ var settings_default = () => {
19
19
  export {
20
20
  settings_default as default
21
21
  };
22
- //# sourceMappingURL=settings-FUYUBGSQ.mjs.map
22
+ //# sourceMappingURL=settings-XRHXVWGB.mjs.map
@@ -12,7 +12,7 @@ import {
12
12
  TemplateKinds,
13
13
  TemplateType,
14
14
  categoryIcons
15
- } from "../chunk-ZVHA24BL.mjs";
15
+ } from "../chunk-AAOKC2JN.mjs";
16
16
  import "../chunk-XOZ7YMO3.mjs";
17
17
  export {
18
18
  AIChatType,
@@ -26,17 +26,17 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var AssistantDialog_B5YKJOAF_exports = {};
30
- __export(AssistantDialog_B5YKJOAF_exports, {
29
+ var AssistantDialog_AN4Z6YUV_exports = {};
30
+ __export(AssistantDialog_AN4Z6YUV_exports, {
31
31
  AssistantDialog: () => AssistantDialog,
32
32
  default: () => AssistantDialog_default
33
33
  });
34
- module.exports = __toCommonJS(AssistantDialog_B5YKJOAF_exports);
34
+ module.exports = __toCommonJS(AssistantDialog_AN4Z6YUV_exports);
35
35
  var import_chunk_HRNIUYVQ = require("./chunk-HRNIUYVQ.cjs");
36
- var import_chunk_WR5L3TVB = require("./chunk-WR5L3TVB.cjs");
37
- var import_chunk_7TQAIKE2 = require("./chunk-7TQAIKE2.cjs");
38
- var import_chunk_BGRQNE3L = require("./chunk-BGRQNE3L.cjs");
39
- var import_chunk_ZP732NHS = require("./chunk-ZP732NHS.cjs");
36
+ var import_chunk_NIDICM57 = require("./chunk-NIDICM57.cjs");
37
+ var import_chunk_LMDJEGZ2 = require("./chunk-LMDJEGZ2.cjs");
38
+ var import_chunk_FUAGEO7Q = require("./chunk-FUAGEO7Q.cjs");
39
+ var import_chunk_QGPWY6GW = require("./chunk-QGPWY6GW.cjs");
40
40
  var import_chunk_P74TWGMG = require("./chunk-P74TWGMG.cjs");
41
41
  var import_tracking = require("@preact-signals/safe-react/tracking");
42
42
  var import_react = __toESM(require("react"));
@@ -54,7 +54,7 @@ var AssistantDialog = ({ chat }) => {
54
54
  open,
55
55
  onOpenChange: setOpen,
56
56
  title: t("assistant dialog title")
57
- }, /* @__PURE__ */ import_react.default.createElement(import_chunk_WR5L3TVB.ThreadContainer, {
57
+ }, /* @__PURE__ */ import_react.default.createElement(import_chunk_NIDICM57.ThreadContainer, {
58
58
  part: "dialog",
59
59
  chat,
60
60
  onOpenChange: setOpen,
@@ -70,4 +70,4 @@ var AssistantDialog_default = AssistantDialog;
70
70
  0 && (module.exports = {
71
71
  AssistantDialog
72
72
  });
73
- //# sourceMappingURL=AssistantDialog-B5YKJOAF.cjs.map
73
+ //# sourceMappingURL=AssistantDialog-AN4Z6YUV.cjs.map
@@ -26,15 +26,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var BlueprintContainer_VD6EIWH7_exports = {};
30
- __export(BlueprintContainer_VD6EIWH7_exports, {
29
+ var BlueprintContainer_NOWLDYCZ_exports = {};
30
+ __export(BlueprintContainer_NOWLDYCZ_exports, {
31
31
  BlueprintContainer: () => BlueprintContainer,
32
32
  EXA_API_KEY: () => EXA_API_KEY,
33
33
  default: () => BlueprintContainer_default
34
34
  });
35
- module.exports = __toCommonJS(BlueprintContainer_VD6EIWH7_exports);
36
- var import_chunk_BGRQNE3L = require("./chunk-BGRQNE3L.cjs");
37
- var import_chunk_ZP732NHS = require("./chunk-ZP732NHS.cjs");
35
+ module.exports = __toCommonJS(BlueprintContainer_NOWLDYCZ_exports);
36
+ var import_chunk_FUAGEO7Q = require("./chunk-FUAGEO7Q.cjs");
37
+ var import_chunk_QGPWY6GW = require("./chunk-QGPWY6GW.cjs");
38
38
  var import_chunk_P74TWGMG = require("./chunk-P74TWGMG.cjs");
39
39
  var import_tracking = require("@preact-signals/safe-react/tracking");
40
40
  var import_json5 = __toESM(require("json5"));
@@ -54,6 +54,11 @@ var import_echo3 = require("@dxos/echo");
54
54
  var import_react_ui2 = require("@dxos/react-ui");
55
55
  var import_react_ui_editor = require("@dxos/react-ui-editor");
56
56
  var import_react_ui_theme = require("@dxos/react-ui-theme");
57
+ var import_echo4 = require("@dxos/client/echo");
58
+ var import_echo5 = require("@dxos/echo");
59
+ var import_functions = require("@dxos/functions");
60
+ var import_invariant = require("@dxos/invariant");
61
+ var import_keys = require("@dxos/keys");
57
62
  var BlueprintEditor = /* @__PURE__ */ (0, import_react2.forwardRef)(({ classNames, blueprint }, forwardedRef) => {
58
63
  var _effect = (0, import_tracking2.useSignals)();
59
64
  try {
@@ -89,6 +94,123 @@ var BlueprintEditor = /* @__PURE__ */ (0, import_react2.forwardRef)(({ className
89
94
  _effect.f();
90
95
  }
91
96
  });
97
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-assistant/src/queue-logger.ts";
98
+ var QueueLogger = class {
99
+ constructor(blueprint) {
100
+ this.blueprint = blueprint;
101
+ const space = (0, import_echo4.getSpace)(blueprint);
102
+ (0, import_invariant.invariant)(space, "Space not found", {
103
+ F: __dxlog_file,
104
+ L: 25,
105
+ S: this,
106
+ A: [
107
+ "space",
108
+ "'Space not found'"
109
+ ]
110
+ });
111
+ this._space = space;
112
+ let dxn = this._space.properties.invocationTraceQueue?.dxn;
113
+ if (!dxn) {
114
+ dxn = import_echo5.DXN.fromQueue(import_keys.QueueSubspaceTags.TRACE, this._space.id, import_echo5.Key.ObjectId.random());
115
+ this._space.properties.invocationTraceQueue = import_echo4.Ref.fromDXN(dxn);
116
+ }
117
+ this._invocationTraceQueue = this._space.queues.get(dxn);
118
+ }
119
+ log(event) {
120
+ switch (event.type) {
121
+ case "begin":
122
+ void this._invocationTraceQueue.append([
123
+ import_echo5.Obj.make(import_functions.InvocationTraceStartEvent, {
124
+ type: import_functions.InvocationTraceEventType.START,
125
+ invocationId: event.invocationId,
126
+ timestampMs: Date.now(),
127
+ input: {},
128
+ invocationTraceQueue: import_echo4.Ref.fromDXN(this._getTraceQueueDxn(event.invocationId)),
129
+ invocationTarget: import_echo4.Ref.make(this.blueprint)
130
+ })
131
+ ]);
132
+ break;
133
+ case "end":
134
+ void this._invocationTraceQueue.append([
135
+ import_echo5.Obj.make(import_functions.InvocationTraceEndEvent, {
136
+ type: import_functions.InvocationTraceEventType.END,
137
+ invocationId: event.invocationId,
138
+ timestampMs: Date.now(),
139
+ outcome: import_functions.InvocationOutcome.SUCCESS
140
+ })
141
+ ]);
142
+ break;
143
+ case "step-start":
144
+ case "step-complete":
145
+ void this._getTraceEventQueue(event.invocationId).append([
146
+ import_echo5.Obj.make(import_functions.TraceEvent, {
147
+ outcome: event.type,
148
+ truncated: false,
149
+ ingestionTimestampMs: Date.now(),
150
+ logs: [
151
+ {
152
+ timestampMs: Date.now(),
153
+ level: "info",
154
+ message: event.type,
155
+ context: {
156
+ step: event.step
157
+ }
158
+ }
159
+ ],
160
+ exceptions: []
161
+ })
162
+ ]);
163
+ break;
164
+ case "message":
165
+ void this._getTraceEventQueue(event.invocationId).append([
166
+ import_echo5.Obj.make(import_functions.TraceEvent, {
167
+ outcome: event.type,
168
+ truncated: false,
169
+ ingestionTimestampMs: Date.now(),
170
+ logs: [
171
+ {
172
+ timestampMs: Date.now(),
173
+ level: "info",
174
+ message: event.type,
175
+ context: {
176
+ message: event.message
177
+ }
178
+ }
179
+ ],
180
+ exceptions: []
181
+ })
182
+ ]);
183
+ break;
184
+ case "block":
185
+ void this._getTraceEventQueue(event.invocationId).append([
186
+ import_echo5.Obj.make(import_functions.TraceEvent, {
187
+ outcome: event.type,
188
+ truncated: false,
189
+ ingestionTimestampMs: Date.now(),
190
+ logs: [
191
+ {
192
+ timestampMs: Date.now(),
193
+ level: "info",
194
+ message: event.type,
195
+ context: {
196
+ block: event.block
197
+ }
198
+ }
199
+ ],
200
+ exceptions: []
201
+ })
202
+ ]);
203
+ break;
204
+ }
205
+ }
206
+ _getTraceQueueDxn(invocationId) {
207
+ return import_echo5.DXN.fromQueue(import_keys.QueueSubspaceTags.TRACE, this._space.id, invocationId);
208
+ }
209
+ _getTraceEventQueue(invocationId) {
210
+ const dxn = this._getTraceQueueDxn(invocationId);
211
+ return this._space.queues.get(dxn);
212
+ }
213
+ };
92
214
  var EXA_API_KEY = "9c7e17ff-0c85-4cd5-827a-8b489f139e03";
93
215
  var parseBlueprint = (text) => {
94
216
  try {
@@ -104,7 +226,7 @@ var BlueprintContainer = ({ role, blueprint }) => {
104
226
  var _effect = (0, import_tracking.useSignals)();
105
227
  try {
106
228
  const { t } = (0, import_react_ui.useTranslation)(import_chunk_P74TWGMG.meta.id);
107
- const aiClient = (0, import_app_framework.useCapability)(import_chunk_ZP732NHS.AssistantCapabilities.AiClient);
229
+ const aiClient = (0, import_app_framework.useCapability)(import_chunk_QGPWY6GW.AssistantCapabilities.AiClient);
108
230
  const selectionManager = (0, import_react_ui_attention.useSelectionManager)();
109
231
  const [definition, setDefinition] = (0, import_react.useState)();
110
232
  (0, import_react.useEffect)(() => {
@@ -134,14 +256,14 @@ var BlueprintContainer = ({ role, blueprint }) => {
134
256
  queue,
135
257
  schema: [],
136
258
  onDone: async (objects) => {
137
- queue.append(objects);
259
+ await queue.append(objects);
138
260
  }
139
261
  })
140
262
  ]);
141
263
  }, [
142
264
  blueprint
143
265
  ]);
144
- const formatAndSave = () => {
266
+ const formatAndSave = (0, import_react.useCallback)(() => {
145
267
  if (!blueprint) {
146
268
  return;
147
269
  }
@@ -170,45 +292,38 @@ var BlueprintContainer = ({ role, blueprint }) => {
170
292
  tools: step.tools
171
293
  });
172
294
  }
173
- return definition2;
174
- };
175
- const handleSave = (0, import_react.useCallback)(() => {
176
- const definition2 = formatAndSave();
177
- if (!definition2) {
178
- return;
179
- }
180
- setDefinition(definition2);
295
+ return blueprint;
181
296
  }, [
182
297
  blueprint
183
298
  ]);
299
+ const handleSave = (0, import_react.useCallback)(() => formatAndSave(), [
300
+ formatAndSave
301
+ ]);
184
302
  const handleRun = (0, import_react.useCallback)(async () => {
185
303
  if (!aiClient?.value || !toolRegistry) {
186
304
  return;
187
305
  }
188
- const definition2 = formatAndSave();
189
- if (!definition2) {
190
- return;
191
- }
306
+ formatAndSave();
192
307
  const input = Array.from((0, import_react_ui_attention.getSelectionSet)(selectionManager)).map((id) => import_echo2.DXN.fromLocalObjectId(id));
193
308
  if (!input.length) {
194
309
  return;
195
310
  }
196
- const blueprint2 = import_assistant.BlueprintParser.create().parse(definition2);
197
- const machine = new import_assistant.BlueprintMachine(toolRegistry, blueprint2).setLogger(new import_assistant.BlueprintLoggerAdapter());
311
+ const machine = new import_assistant.BlueprintMachine(toolRegistry, blueprint).setLogger(new QueueLogger(blueprint));
198
312
  await machine.runToCompletion({
199
313
  aiClient: aiClient.value,
200
314
  input
201
315
  });
202
316
  }, [
203
317
  aiClient.value,
318
+ blueprint,
319
+ formatAndSave,
320
+ selectionManager,
204
321
  toolRegistry
205
322
  ]);
206
323
  return /* @__PURE__ */ import_react.default.createElement(import_react_ui_stack.StackItem.Content, {
207
324
  role,
208
325
  toolbar: true
209
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Toolbar.Root, {
210
- classNames: "border-be border-subduedSeparator"
211
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Toolbar.Button, {
326
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Toolbar.Root, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Toolbar.Button, {
212
327
  onClick: handleSave
213
328
  }, t("button save")), /* @__PURE__ */ import_react.default.createElement(import_react_ui.Toolbar.Button, {
214
329
  onClick: handleRun
@@ -226,4 +341,4 @@ var BlueprintContainer_default = BlueprintContainer;
226
341
  BlueprintContainer,
227
342
  EXA_API_KEY
228
343
  });
229
- //# sourceMappingURL=BlueprintContainer-VD6EIWH7.cjs.map
344
+ //# sourceMappingURL=BlueprintContainer-NOWLDYCZ.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/BlueprintContainer.tsx", "../../../src/components/BlueprintEditor/BlueprintEditor.tsx", "../../../src/queue-logger.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport JSON5 from 'json5';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { ToolRegistry } from '@dxos/ai';\nimport { useCapability } from '@dxos/app-framework';\nimport {\n type Blueprint,\n type BlueprintDefinition,\n BlueprintMachine,\n createLocalSearchTool,\n createExaTool,\n createGraphWriterTool,\n} from '@dxos/assistant';\nimport { getSpace } from '@dxos/client/echo';\nimport { DXN, Key } from '@dxos/echo';\nimport { Toolbar, useTranslation } from '@dxos/react-ui';\nimport { getSelectionSet, useSelectionManager } from '@dxos/react-ui-attention';\nimport { StackItem, type StackItemContentProps } from '@dxos/react-ui-stack';\n\nimport { BlueprintEditor } from './BlueprintEditor';\nimport { AssistantCapabilities } from '../capabilities';\nimport { meta } from '../meta';\nimport { QueueLogger } from '../queue-logger';\n\n// TODO(burdon): Move to config.\nexport const EXA_API_KEY = '9c7e17ff-0c85-4cd5-827a-8b489f139e03';\n\n// TODO(burdon): Validate.\nconst parseBlueprint = (text: string): BlueprintDefinition | undefined => {\n try {\n const json = JSON5.parse(text);\n const { steps } = json;\n return { steps };\n } catch (error) {\n // Ignore.\n }\n};\n\nexport const BlueprintContainer = ({\n role,\n blueprint,\n}: Pick<StackItemContentProps, 'role'> & { blueprint: Blueprint }) => {\n const { t } = useTranslation(meta.id);\n const aiClient = useCapability(AssistantCapabilities.AiClient);\n const selectionManager = useSelectionManager();\n const [definition, setDefinition] = useState<BlueprintDefinition>();\n useEffect(() => {\n setDefinition({\n steps: blueprint.steps.map(({ instructions, tools }) => ({ instructions, tools })),\n });\n }, [blueprint]);\n\n const editorRef = useRef<EditorView | undefined>(undefined);\n\n // TODO(burdon): Factor out.\n const toolRegistry = useMemo(() => {\n const space = getSpace(blueprint);\n if (!space) {\n return;\n }\n\n // TODO(burdon): How should the queue be created?\n const queue = space.queues.create();\n\n return new ToolRegistry([\n createExaTool({ apiKey: EXA_API_KEY }),\n createLocalSearchTool(space.db, queue),\n createGraphWriterTool({\n db: space.db,\n queue,\n schema: [], // TODO(burdon): Get schema from client/blueprint?\n onDone: async (objects) => {\n await queue.append(objects);\n },\n }),\n ]);\n }, [blueprint]);\n\n const formatAndSave = useCallback((): BlueprintDefinition | undefined => {\n if (!blueprint) {\n return;\n }\n\n const text = editorRef.current?.state.doc.toString();\n if (!text) {\n return;\n }\n\n const definition = parseBlueprint(text);\n if (!definition) {\n return;\n }\n\n setDefinition(definition);\n const formatted = JSON.stringify(definition, null, 2);\n editorRef.current?.dispatch({\n changes: { from: 0, to: text.length, insert: formatted },\n });\n\n blueprint.steps.length = 0;\n for (const step of definition.steps) {\n blueprint.steps.push({\n id: Key.ObjectId.random(),\n instructions: step.instructions,\n tools: step.tools,\n });\n }\n\n return blueprint;\n }, [blueprint]);\n\n // TODO(burdon): Save raw blueprint separately from parsed blueprint? (like Script).\n const handleSave = useCallback(() => formatAndSave(), [formatAndSave]);\n\n const handleRun = useCallback(async () => {\n if (!aiClient?.value || !toolRegistry) {\n return;\n }\n\n formatAndSave();\n\n // Get input from selection.\n const input = Array.from(getSelectionSet(selectionManager)).map((id) => DXN.fromLocalObjectId(id));\n if (!input.length) {\n return;\n }\n\n const machine = new BlueprintMachine(toolRegistry, blueprint).setLogger(new QueueLogger(blueprint));\n await machine.runToCompletion({ aiClient: aiClient.value, input });\n }, [aiClient.value, blueprint, formatAndSave, selectionManager, toolRegistry]);\n\n return (\n <StackItem.Content role={role} toolbar>\n <Toolbar.Root>\n <Toolbar.Button onClick={handleSave}>{t('button save')}</Toolbar.Button>\n <Toolbar.Button onClick={handleRun}>{t('button run')}</Toolbar.Button>\n </Toolbar.Root>\n {definition && <BlueprintEditor ref={editorRef} blueprint={definition} />}\n </StackItem.Content>\n );\n};\n\nexport default BlueprintContainer;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { forwardRef, useImperativeHandle } from 'react';\n\nimport { BlueprintDefinition } from '@dxos/assistant';\nimport { Type } from '@dxos/echo';\nimport { useThemeContext, type ThemedClassName } from '@dxos/react-ui';\nimport {\n type EditorView,\n createBasicExtensions,\n createJsonExtensions,\n createThemeExtensions,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type BlueprintEditorProps = ThemedClassName<{\n blueprint: BlueprintDefinition;\n}>;\n\n// TODO(burdon): Factor out JsonEditor.\nexport const BlueprintEditor = forwardRef<EditorView | undefined, BlueprintEditorProps>(\n ({ classNames, blueprint }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const { parentRef, view } = useTextEditor({\n initialValue: JSON.stringify(blueprint, null, 2),\n extensions: [\n createBasicExtensions({\n lineNumbers: true,\n lineWrapping: false,\n monospace: true,\n scrollPastEnd: true,\n }),\n createThemeExtensions({\n themeMode,\n syntaxHighlighting: true,\n }),\n createJsonExtensions({\n schema: Type.toJsonSchema(BlueprintDefinition, { strict: true }),\n }),\n ],\n });\n\n useImperativeHandle(forwardedRef, () => view, [view]);\n\n return <div ref={parentRef} className={mx('overflow-hidden', classNames)} />;\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Blueprint, type BlueprintEvent, type BlueprintLogger } from '@dxos/assistant';\nimport { getSpace, Ref, type Queue, type Space } from '@dxos/client/echo';\nimport { DXN, Key, Obj } from '@dxos/echo';\nimport {\n InvocationOutcome,\n InvocationTraceEndEvent,\n InvocationTraceEventType,\n InvocationTraceStartEvent,\n TraceEvent,\n type InvocationTraceEvent,\n} from '@dxos/functions';\nimport { invariant } from '@dxos/invariant';\nimport { QueueSubspaceTags } from '@dxos/keys';\n\nexport class QueueLogger implements BlueprintLogger {\n private _space: Space;\n private _invocationTraceQueue: Queue<InvocationTraceEvent>;\n\n constructor(private readonly blueprint: Blueprint) {\n const space = getSpace(blueprint);\n invariant(space, 'Space not found');\n this._space = space;\n let dxn = this._space.properties.invocationTraceQueue?.dxn;\n if (!dxn) {\n dxn = DXN.fromQueue(QueueSubspaceTags.TRACE, this._space.id, Key.ObjectId.random());\n this._space.properties.invocationTraceQueue = Ref.fromDXN(dxn);\n }\n this._invocationTraceQueue = this._space.queues.get(dxn);\n }\n\n log(event: BlueprintEvent) {\n switch (event.type) {\n case 'begin':\n void this._invocationTraceQueue.append([\n Obj.make(InvocationTraceStartEvent, {\n type: InvocationTraceEventType.START,\n invocationId: event.invocationId,\n timestampMs: Date.now(),\n input: {},\n invocationTraceQueue: Ref.fromDXN(this._getTraceQueueDxn(event.invocationId)),\n invocationTarget: Ref.make(this.blueprint),\n }),\n ]);\n break;\n case 'end':\n void this._invocationTraceQueue.append([\n Obj.make(InvocationTraceEndEvent, {\n type: InvocationTraceEventType.END,\n invocationId: event.invocationId,\n timestampMs: Date.now(),\n outcome: InvocationOutcome.SUCCESS,\n }),\n ]);\n break;\n case 'step-start':\n case 'step-complete':\n void this._getTraceEventQueue(event.invocationId).append([\n Obj.make(TraceEvent, {\n outcome: event.type,\n truncated: false,\n ingestionTimestampMs: Date.now(),\n logs: [\n {\n timestampMs: Date.now(),\n level: 'info',\n message: event.type,\n context: { step: event.step },\n },\n ],\n exceptions: [],\n }),\n ]);\n break;\n case 'message':\n void this._getTraceEventQueue(event.invocationId).append([\n Obj.make(TraceEvent, {\n outcome: event.type,\n truncated: false,\n ingestionTimestampMs: Date.now(),\n logs: [\n {\n timestampMs: Date.now(),\n level: 'info',\n message: event.type,\n context: { message: event.message },\n },\n ],\n exceptions: [],\n }),\n ]);\n break;\n case 'block':\n void this._getTraceEventQueue(event.invocationId).append([\n Obj.make(TraceEvent, {\n outcome: event.type,\n truncated: false,\n ingestionTimestampMs: Date.now(),\n logs: [\n {\n timestampMs: Date.now(),\n level: 'info',\n message: event.type,\n context: { block: event.block },\n },\n ],\n exceptions: [],\n }),\n ]);\n break;\n }\n }\n\n private _getTraceQueueDxn(invocationId: string): DXN {\n return DXN.fromQueue(QueueSubspaceTags.TRACE, this._space.id, invocationId);\n }\n\n private _getTraceEventQueue(invocationId: string): Queue<TraceEvent> {\n const dxn = this._getTraceQueueDxn(invocationId);\n return this._space.queues.get(dxn);\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,mBAAkB;AAClB,mBAAyE;AAEzE,gBAA6B;AAC7B,2BAA8B;AAC9B,uBAOO;AACP,kBAAyB;AACzB,IAAAA,eAAyB;AACzB,sBAAwC;AACxC,gCAAqD;AACrD,4BAAsD;;AClBtD,IAAAC,gBAAuD;AAEvD,IAAAC,oBAAoC;AACpC,IAAAF,eAAqB;AACrB,IAAAG,mBAAsD;AACtD,6BAMO;AACP,4BAAmB;ACXnB,IAAAH,eAAsD;AACtD,IAAAA,eAA8B;AAC9B,uBAOO;AACP,uBAA0B;AAC1B,kBAAkC;ADO3B,IAAMI,kBAAkBC,8CAC7B,CAAC,EAAEC,YAAYC,UAAS,GAAIC,iBAAAA;;;AAC1B,UAAM,EAAEC,UAAS,QAAKC,kCAAAA;AACtB,UAAM,EAAEC,WAAWC,KAAI,QAAKC,sCAAc;MACxCC,cAAcC,KAAKC,UAAUT,WAAW,MAAM,CAAA;MAC9CU,YAAY;YACVC,8CAAsB;UACpBC,aAAa;UACbC,cAAc;UACdC,WAAW;UACXC,eAAe;QACjB,CAAA;YACAC,8CAAsB;UACpBd;UACAe,oBAAoB;QACtB,CAAA;YACAC,6CAAqB;UACnBC,QAAQC,kBAAKC,aAAaC,uCAAqB;YAAEC,QAAQ;UAAK,CAAA;QAChE,CAAA;;IAEJ,CAAA;AAEAC,2CAAoBvB,cAAc,MAAMI,MAAM;MAACA;KAAK;AAEpD,WAAO,8BAAAoB,QAAA,cAACC,OAAAA;MAAIC,KAAKvB;MAAWwB,eAAWC,0BAAG,mBAAmB9B,UAAAA;;;;;AAC/D,CAAA;;AC9BK,IAAM+B,cAAN,MAAMA;EAIX,YAA6B9B,WAAsB;SAAtBA,YAAAA;AAC3B,UAAM+B,YAAQC,uBAAShC,SAAAA;AACvBiC,oCAAUF,OAAO,mBAAA;;;;;;;;;AACjB,SAAKG,SAASH;AACd,QAAII,MAAM,KAAKD,OAAOE,WAAWC,sBAAsBF;AACvD,QAAI,CAACA,KAAK;AACRA,YAAMG,iBAAIC,UAAUC,8BAAkBC,OAAO,KAAKP,OAAOQ,IAAIC,iBAAIC,SAASC,OAAM,CAAA;AAChF,WAAKX,OAAOE,WAAWC,uBAAuBS,iBAAIC,QAAQZ,GAAAA;IAC5D;AACA,SAAKa,wBAAwB,KAAKd,OAAOe,OAAOC,IAAIf,GAAAA;EACtD;EAEAgB,IAAIC,OAAuB;AACzB,YAAQA,MAAMC,MAAI;MAChB,KAAK;AACH,aAAK,KAAKL,sBAAsBM,OAAO;UACrCC,iBAAIC,KAAKC,4CAA2B;YAClCJ,MAAMK,0CAAyBC;YAC/BC,cAAcR,MAAMQ;YACpBC,aAAaC,KAAKC,IAAG;YACrBC,OAAO,CAAC;YACR3B,sBAAsBS,iBAAIC,QAAQ,KAAKkB,kBAAkBb,MAAMQ,YAAY,CAAA;YAC3EM,kBAAkBpB,iBAAIU,KAAK,KAAKxD,SAAS;UAC3C,CAAA;SACD;AACD;MACF,KAAK;AACH,aAAK,KAAKgD,sBAAsBM,OAAO;UACrCC,iBAAIC,KAAKW,0CAAyB;YAChCd,MAAMK,0CAAyBU;YAC/BR,cAAcR,MAAMQ;YACpBC,aAAaC,KAAKC,IAAG;YACrBM,SAASC,mCAAkBC;UAC7B,CAAA;SACD;AACD;MACF,KAAK;MACL,KAAK;AACH,aAAK,KAAKC,oBAAoBpB,MAAMQ,YAAY,EAAEN,OAAO;UACvDC,iBAAIC,KAAKiB,6BAAY;YACnBJ,SAASjB,MAAMC;YACfqB,WAAW;YACXC,sBAAsBb,KAAKC,IAAG;YAC9Ba,MAAM;cACJ;gBACEf,aAAaC,KAAKC,IAAG;gBACrBc,OAAO;gBACPC,SAAS1B,MAAMC;gBACf0B,SAAS;kBAAEC,MAAM5B,MAAM4B;gBAAK;cAC9B;;YAEFC,YAAY,CAAA;UACd,CAAA;SACD;AACD;MACF,KAAK;AACH,aAAK,KAAKT,oBAAoBpB,MAAMQ,YAAY,EAAEN,OAAO;UACvDC,iBAAIC,KAAKiB,6BAAY;YACnBJ,SAASjB,MAAMC;YACfqB,WAAW;YACXC,sBAAsBb,KAAKC,IAAG;YAC9Ba,MAAM;cACJ;gBACEf,aAAaC,KAAKC,IAAG;gBACrBc,OAAO;gBACPC,SAAS1B,MAAMC;gBACf0B,SAAS;kBAAED,SAAS1B,MAAM0B;gBAAQ;cACpC;;YAEFG,YAAY,CAAA;UACd,CAAA;SACD;AACD;MACF,KAAK;AACH,aAAK,KAAKT,oBAAoBpB,MAAMQ,YAAY,EAAEN,OAAO;UACvDC,iBAAIC,KAAKiB,6BAAY;YACnBJ,SAASjB,MAAMC;YACfqB,WAAW;YACXC,sBAAsBb,KAAKC,IAAG;YAC9Ba,MAAM;cACJ;gBACEf,aAAaC,KAAKC,IAAG;gBACrBc,OAAO;gBACPC,SAAS1B,MAAMC;gBACf0B,SAAS;kBAAEG,OAAO9B,MAAM8B;gBAAM;cAChC;;YAEFD,YAAY,CAAA;UACd,CAAA;SACD;AACD;IACJ;EACF;EAEQhB,kBAAkBL,cAA2B;AACnD,WAAOtB,iBAAIC,UAAUC,8BAAkBC,OAAO,KAAKP,OAAOQ,IAAIkB,YAAAA;EAChE;EAEQY,oBAAoBZ,cAAyC;AACnE,UAAMzB,MAAM,KAAK8B,kBAAkBL,YAAAA;AACnC,WAAO,KAAK1B,OAAOe,OAAOC,IAAIf,GAAAA;EAChC;AACF;AF9FO,IAAMgD,cAAc;AAG3B,IAAMC,iBAAiB,CAACC,SAAAA;AACtB,MAAI;AACF,UAAMC,OAAOC,aAAAA,QAAMC,MAAMH,IAAAA;AACzB,UAAM,EAAEI,MAAK,IAAKH;AAClB,WAAO;MAAEG;IAAM;EACjB,SAASC,OAAO;EAEhB;AACF;AAEO,IAAMC,qBAAqB,CAAC,EACjCC,MACA5F,UAAS,MACsD;;;AAC/D,UAAM,EAAE6F,EAAC,QAAKC,gCAAeC,2BAAKrD,EAAE;AACpC,UAAMsD,eAAWC,oCAAcC,4CAAsBC,QAAQ;AAC7D,UAAMC,uBAAmBC,+CAAAA;AACzB,UAAM,CAACC,YAAYC,aAAAA,QAAiBC,uBAAAA;AACpCC,gCAAU,MAAA;AACRF,oBAAc;QACZd,OAAOzF,UAAUyF,MAAMiB,IAAI,CAAC,EAAEC,cAAcC,MAAK,OAAQ;UAAED;UAAcC;QAAM,EAAA;MACjF,CAAA;IACF,GAAG;MAAC5G;KAAU;AAEd,UAAM6G,gBAAYC,qBAA+BC,MAAAA;AAGjD,UAAMC,mBAAeC,sBAAQ,MAAA;AAC3B,YAAMlF,YAAQC,YAAAA,UAAShC,SAAAA;AACvB,UAAI,CAAC+B,OAAO;AACV;MACF;AAGA,YAAMmF,QAAQnF,MAAMkB,OAAOkE,OAAM;AAEjC,aAAO,IAAIC,uBAAa;YACtBC,gCAAc;UAAEC,QAAQnC;QAAY,CAAA;YACpCoC,wCAAsBxF,MAAMyF,IAAIN,KAAAA;YAChCO,wCAAsB;UACpBD,IAAIzF,MAAMyF;UACVN;UACA/F,QAAQ,CAAA;UACRuG,QAAQ,OAAOC,YAAAA;AACb,kBAAMT,MAAM5D,OAAOqE,OAAAA;UACrB;QACF,CAAA;OACD;IACH,GAAG;MAAC3H;KAAU;AAEd,UAAM4H,oBAAgBC,0BAAY,MAAA;AAChC,UAAI,CAAC7H,WAAW;AACd;MACF;AAEA,YAAMqF,OAAOwB,UAAUiB,SAASC,MAAMC,IAAIC,SAAAA;AAC1C,UAAI,CAAC5C,MAAM;AACT;MACF;AAEA,YAAMiB,cAAalB,eAAeC,IAAAA;AAClC,UAAI,CAACiB,aAAY;AACf;MACF;AAEAC,oBAAcD,WAAAA;AACd,YAAM4B,YAAY1H,KAAKC,UAAU6F,aAAY,MAAM,CAAA;AACnDO,gBAAUiB,SAASK,SAAS;QAC1BC,SAAS;UAAEC,MAAM;UAAGC,IAAIjD,KAAKkD;UAAQC,QAAQN;QAAU;MACzD,CAAA;AAEAlI,gBAAUyF,MAAM8C,SAAS;AACzB,iBAAWvD,QAAQsB,YAAWb,OAAO;AACnCzF,kBAAUyF,MAAMgD,KAAK;UACnB/F,IAAIC,aAAAA,IAAIC,SAASC,OAAM;UACvB8D,cAAc3B,KAAK2B;UACnBC,OAAO5B,KAAK4B;QACd,CAAA;MACF;AAEA,aAAO5G;IACT,GAAG;MAACA;KAAU;AAGd,UAAM0I,iBAAab,0BAAY,MAAMD,cAAAA,GAAiB;MAACA;KAAc;AAErE,UAAMe,gBAAYd,0BAAY,YAAA;AAC5B,UAAI,CAAC7B,UAAU4C,SAAS,CAAC5B,cAAc;AACrC;MACF;AAEAY,oBAAAA;AAGA,YAAM5D,QAAQ6E,MAAMR,SAAKS,2CAAgB1C,gBAAAA,CAAAA,EAAmBM,IAAI,CAAChE,OAAOJ,aAAAA,IAAIyG,kBAAkBrG,EAAAA,CAAAA;AAC9F,UAAI,CAACsB,MAAMuE,QAAQ;AACjB;MACF;AAEA,YAAMS,UAAU,IAAIC,kCAAiBjC,cAAchH,SAAAA,EAAWkJ,UAAU,IAAIpH,YAAY9B,SAAAA,CAAAA;AACxF,YAAMgJ,QAAQG,gBAAgB;QAAEnD,UAAUA,SAAS4C;QAAO5E;MAAM,CAAA;IAClE,GAAG;MAACgC,SAAS4C;MAAO5I;MAAW4H;MAAexB;MAAkBY;KAAa;AAE7E,WACEvF,6BAAAA,QAAA,cAAC2H,gCAAUC,SAAO;MAACzD;MAAY0D,SAAAA;OAC7B7H,6BAAAA,QAAA,cAAC8H,wBAAQC,MAAI,MACX/H,6BAAAA,QAAA,cAAC8H,wBAAQE,QAAM;MAACC,SAAShB;OAAa7C,EAAE,aAAA,CAAA,GACxCpE,6BAAAA,QAAA,cAAC8H,wBAAQE,QAAM;MAACC,SAASf;OAAY9C,EAAE,YAAA,CAAA,CAAA,GAExCS,cAAc7E,6BAAAA,QAAA,cAAC5B,iBAAAA;MAAgB8B,KAAKkF;MAAW7G,WAAWsG;;;;;AAGjE;AAEA,IAAA,6BAAeX;",
6
+ "names": ["import_echo", "import_react", "import_assistant", "import_react_ui", "BlueprintEditor", "forwardRef", "classNames", "blueprint", "forwardedRef", "themeMode", "useThemeContext", "parentRef", "view", "useTextEditor", "initialValue", "JSON", "stringify", "extensions", "createBasicExtensions", "lineNumbers", "lineWrapping", "monospace", "scrollPastEnd", "createThemeExtensions", "syntaxHighlighting", "createJsonExtensions", "schema", "Type", "toJsonSchema", "BlueprintDefinition", "strict", "useImperativeHandle", "React", "div", "ref", "className", "mx", "QueueLogger", "space", "getSpace", "invariant", "_space", "dxn", "properties", "invocationTraceQueue", "DXN", "fromQueue", "QueueSubspaceTags", "TRACE", "id", "Key", "ObjectId", "random", "Ref", "fromDXN", "_invocationTraceQueue", "queues", "get", "log", "event", "type", "append", "Obj", "make", "InvocationTraceStartEvent", "InvocationTraceEventType", "START", "invocationId", "timestampMs", "Date", "now", "input", "_getTraceQueueDxn", "invocationTarget", "InvocationTraceEndEvent", "END", "outcome", "InvocationOutcome", "SUCCESS", "_getTraceEventQueue", "TraceEvent", "truncated", "ingestionTimestampMs", "logs", "level", "message", "context", "step", "exceptions", "block", "EXA_API_KEY", "parseBlueprint", "text", "json", "JSON5", "parse", "steps", "error", "BlueprintContainer", "role", "t", "useTranslation", "meta", "aiClient", "useCapability", "AssistantCapabilities", "AiClient", "selectionManager", "useSelectionManager", "definition", "setDefinition", "useState", "useEffect", "map", "instructions", "tools", "editorRef", "useRef", "undefined", "toolRegistry", "useMemo", "queue", "create", "ToolRegistry", "createExaTool", "apiKey", "createLocalSearchTool", "db", "createGraphWriterTool", "onDone", "objects", "formatAndSave", "useCallback", "current", "state", "doc", "toString", "formatted", "dispatch", "changes", "from", "to", "length", "insert", "push", "handleSave", "handleRun", "value", "Array", "getSelectionSet", "fromLocalObjectId", "machine", "BlueprintMachine", "setLogger", "runToCompletion", "StackItem", "Content", "toolbar", "Toolbar", "Root", "Button", "onClick"]
7
+ }
@@ -26,16 +26,16 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var ChatContainer_WFLTSAFA_exports = {};
30
- __export(ChatContainer_WFLTSAFA_exports, {
29
+ var ChatContainer_VKYBQHUB_exports = {};
30
+ __export(ChatContainer_VKYBQHUB_exports, {
31
31
  ChatContainer: () => ChatContainer,
32
32
  default: () => ChatContainer_default
33
33
  });
34
- module.exports = __toCommonJS(ChatContainer_WFLTSAFA_exports);
35
- var import_chunk_WR5L3TVB = require("./chunk-WR5L3TVB.cjs");
36
- var import_chunk_7TQAIKE2 = require("./chunk-7TQAIKE2.cjs");
37
- var import_chunk_BGRQNE3L = require("./chunk-BGRQNE3L.cjs");
38
- var import_chunk_ZP732NHS = require("./chunk-ZP732NHS.cjs");
34
+ module.exports = __toCommonJS(ChatContainer_VKYBQHUB_exports);
35
+ var import_chunk_NIDICM57 = require("./chunk-NIDICM57.cjs");
36
+ var import_chunk_LMDJEGZ2 = require("./chunk-LMDJEGZ2.cjs");
37
+ var import_chunk_FUAGEO7Q = require("./chunk-FUAGEO7Q.cjs");
38
+ var import_chunk_QGPWY6GW = require("./chunk-QGPWY6GW.cjs");
39
39
  var import_chunk_P74TWGMG = require("./chunk-P74TWGMG.cjs");
40
40
  var import_tracking = require("@preact-signals/safe-react/tracking");
41
41
  var import_react = __toESM(require("react"));
@@ -50,7 +50,7 @@ var ChatContainer = ({ role, chat, associatedArtifact }) => {
50
50
  return /* @__PURE__ */ import_react.default.createElement(import_react_ui_stack.StackItem.Content, {
51
51
  role,
52
52
  classNames: "container-max-width"
53
- }, /* @__PURE__ */ import_react.default.createElement(import_chunk_WR5L3TVB.ThreadContainer, {
53
+ }, /* @__PURE__ */ import_react.default.createElement(import_chunk_NIDICM57.ThreadContainer, {
54
54
  chat,
55
55
  settings,
56
56
  transcription,
@@ -65,4 +65,4 @@ var ChatContainer_default = ChatContainer;
65
65
  0 && (module.exports = {
66
66
  ChatContainer
67
67
  });
68
- //# sourceMappingURL=ChatContainer-WFLTSAFA.cjs.map
68
+ //# sourceMappingURL=ChatContainer-VKYBQHUB.cjs.map
@@ -16,12 +16,12 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var ai_client_3XNIFMJX_exports = {};
20
- __export(ai_client_3XNIFMJX_exports, {
19
+ var ai_client_7HNSMUMT_exports = {};
20
+ __export(ai_client_7HNSMUMT_exports, {
21
21
  default: () => ai_client_default
22
22
  });
23
- module.exports = __toCommonJS(ai_client_3XNIFMJX_exports);
24
- var import_chunk_ZP732NHS = require("./chunk-ZP732NHS.cjs");
23
+ module.exports = __toCommonJS(ai_client_7HNSMUMT_exports);
24
+ var import_chunk_QGPWY6GW = require("./chunk-QGPWY6GW.cjs");
25
25
  var import_chunk_P74TWGMG = require("./chunk-P74TWGMG.cjs");
26
26
  var import_signals_core = require("@preact/signals-core");
27
27
  var import_ai = require("@dxos/ai");
@@ -31,15 +31,15 @@ var DEFAULT_AI_SERVICE_URL = "http://localhost:8788";
31
31
  var ai_client_default = (context) => {
32
32
  const client = context.getCapability(import_plugin_client.ClientCapabilities.Client);
33
33
  const endpoint = client.config.values.runtime?.services?.ai?.server ?? DEFAULT_AI_SERVICE_URL;
34
- const aiClient = (0, import_signals_core.signal)(new import_ai.AIServiceEdgeClient({
34
+ const aiClient = (0, import_signals_core.signal)(new import_ai.EdgeAiServiceClient({
35
35
  endpoint
36
36
  }));
37
37
  const unsubscribe = (0, import_signals_core.effect)(() => {
38
38
  const settings = context.getCapability(import_app_framework.Capabilities.SettingsStore).getStore(import_chunk_P74TWGMG.ASSISTANT_PLUGIN)?.value;
39
39
  if (settings?.llmProvider === "ollama") {
40
- aiClient.value = new import_ai.OllamaClient();
40
+ aiClient.value = new import_ai.OllamaAiServiceClient();
41
41
  } else {
42
- aiClient.value = new import_ai.AIServiceEdgeClient({
42
+ aiClient.value = new import_ai.EdgeAiServiceClient({
43
43
  endpoint,
44
44
  defaultGenerationOptions: {
45
45
  // model: '@anthropic/claude-sonnet-4-20250514',
@@ -48,6 +48,6 @@ var ai_client_default = (context) => {
48
48
  });
49
49
  }
50
50
  });
51
- return (0, import_app_framework.contributes)(import_chunk_ZP732NHS.AssistantCapabilities.AiClient, aiClient, () => unsubscribe());
51
+ return (0, import_app_framework.contributes)(import_chunk_QGPWY6GW.AssistantCapabilities.AiClient, aiClient, () => unsubscribe());
52
52
  };
53
- //# sourceMappingURL=ai-client-3XNIFMJX.cjs.map
53
+ //# sourceMappingURL=ai-client-7HNSMUMT.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/ai-client.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { effect, signal } from '@preact/signals-core';\n\nimport { type AiServiceClient, EdgeAiServiceClient, OllamaAiServiceClient } from '@dxos/ai';\nimport { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { AssistantCapabilities } from './capabilities';\nimport { ASSISTANT_PLUGIN } from '../meta';\nimport { type AssistantSettingsProps } from '../types';\n\n// TODO(wittjosiah): Factor out.\nconst DEFAULT_AI_SERVICE_URL = 'http://localhost:8788';\n\nexport default (context: PluginContext) => {\n const client = context.getCapability(ClientCapabilities.Client);\n const endpoint = client.config.values.runtime?.services?.ai?.server ?? DEFAULT_AI_SERVICE_URL;\n const aiClient = signal<AiServiceClient>(new EdgeAiServiceClient({ endpoint }));\n\n const unsubscribe = effect(() => {\n const settings = context\n .getCapability(Capabilities.SettingsStore)\n .getStore<AssistantSettingsProps>(ASSISTANT_PLUGIN)?.value;\n\n if (settings?.llmProvider === 'ollama') {\n aiClient.value = new OllamaAiServiceClient();\n } else {\n aiClient.value = new EdgeAiServiceClient({\n endpoint,\n defaultGenerationOptions: {\n // model: '@anthropic/claude-sonnet-4-20250514',\n model: '@anthropic/claude-3-5-haiku-20241022',\n },\n });\n }\n });\n\n return contributes(AssistantCapabilities.AiClient, aiClient, () => unsubscribe());\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,0BAA+B;AAE/B,gBAAiF;AACjF,2BAA8D;AAC9D,2BAAmC;AAOnC,IAAMA,yBAAyB;AAE/B,IAAA,oBAAe,CAACC,YAAAA;AACd,QAAMC,SAASD,QAAQE,cAAcC,wCAAmBC,MAAM;AAC9D,QAAMC,WAAWJ,OAAOK,OAAOC,OAAOC,SAASC,UAAUC,IAAIC,UAAUZ;AACvE,QAAMa,eAAWC,4BAAwB,IAAIC,8BAAoB;IAAET;EAAS,CAAA,CAAA;AAE5E,QAAMU,kBAAcC,4BAAO,MAAA;AACzB,UAAMC,WAAWjB,QACdE,cAAcgB,kCAAaC,aAAa,EACxCC,SAAiCC,sCAAAA,GAAmBC;AAEvD,QAAIL,UAAUM,gBAAgB,UAAU;AACtCX,eAASU,QAAQ,IAAIE,gCAAAA;IACvB,OAAO;AACLZ,eAASU,QAAQ,IAAIR,8BAAoB;QACvCT;QACAoB,0BAA0B;;UAExBC,OAAO;QACT;MACF,CAAA;IACF;EACF,CAAA;AAEA,aAAOC,kCAAYC,4CAAsBC,UAAUjB,UAAU,MAAMG,YAAAA,CAAAA;AACrE;",
6
+ "names": ["DEFAULT_AI_SERVICE_URL", "context", "client", "getCapability", "ClientCapabilities", "Client", "endpoint", "config", "values", "runtime", "services", "ai", "server", "aiClient", "signal", "EdgeAiServiceClient", "unsubscribe", "effect", "settings", "Capabilities", "SettingsStore", "getStore", "ASSISTANT_PLUGIN", "value", "llmProvider", "OllamaAiServiceClient", "defaultGenerationOptions", "model", "contributes", "AssistantCapabilities", "AiClient"]
7
+ }
@@ -16,16 +16,17 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var app_graph_builder_VEPLBTML_exports = {};
20
- __export(app_graph_builder_VEPLBTML_exports, {
19
+ var app_graph_builder_PPR5B5KU_exports = {};
20
+ __export(app_graph_builder_PPR5B5KU_exports, {
21
21
  default: () => app_graph_builder_default
22
22
  });
23
- module.exports = __toCommonJS(app_graph_builder_VEPLBTML_exports);
24
- var import_chunk_7TQAIKE2 = require("./chunk-7TQAIKE2.cjs");
23
+ module.exports = __toCommonJS(app_graph_builder_PPR5B5KU_exports);
24
+ var import_chunk_LMDJEGZ2 = require("./chunk-LMDJEGZ2.cjs");
25
25
  var import_chunk_P74TWGMG = require("./chunk-P74TWGMG.cjs");
26
26
  var import_rx_react = require("@effect-rx/rx-react");
27
27
  var import_effect = require("effect");
28
28
  var import_app_framework = require("@dxos/app-framework");
29
+ var import_assistant = require("@dxos/assistant");
29
30
  var import_echo = require("@dxos/echo");
30
31
  var import_invariant = require("@dxos/invariant");
31
32
  var import_plugin_client = require("@dxos/plugin-client");
@@ -44,21 +45,8 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
44
45
  data: async () => {
45
46
  const { dispatchPromise: dispatch } = context.getCapability(import_app_framework.Capabilities.IntentDispatcher);
46
47
  const client = context.getCapability(import_plugin_client.ClientCapabilities.Client);
47
- const layout = context.getCapability(import_app_framework.Capabilities.Layout);
48
- const { graph } = context.getCapability(import_app_framework.Capabilities.AppGraph);
49
- let chat;
50
- if (layout.active.length > 0) {
51
- const node2 = graph.getNode(layout.active[0]).pipe(import_effect.Option.getOrNull);
52
- if (node2) {
53
- const space = (0, import_echo2.getSpace)(node2.data);
54
- if (space) {
55
- chat = await getOrCreateChat(dispatch, space);
56
- }
57
- }
58
- } else {
59
- const space = client.spaces.default;
60
- chat = await getOrCreateChat(dispatch, space);
61
- }
48
+ const space = (0, import_plugin_space.getActiveSpace)(context) ?? client.spaces.default;
49
+ const chat = await getOrCreateChat(dispatch, space);
62
50
  if (!chat) {
63
51
  return;
64
52
  }
@@ -110,7 +98,7 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
110
98
  return [];
111
99
  }
112
100
  if (!query) {
113
- query = space.db.query(import_echo2.Query.select(import_echo2.Filter.ids(object.id)).targetOf(import_chunk_7TQAIKE2.CompanionTo).source());
101
+ query = space.db.query(import_echo2.Query.select(import_echo2.Filter.ids(object.id)).targetOf(import_chunk_LMDJEGZ2.CompanionTo).source());
114
102
  }
115
103
  const chat = get((0, import_plugin_space.rxFromQuery)(query))[0];
116
104
  return [
@@ -137,13 +125,36 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
137
125
  });
138
126
  }
139
127
  }),
128
+ (0, import_plugin_graph.createExtension)({
129
+ id: `${import_chunk_P74TWGMG.ASSISTANT_PLUGIN}/blueprint-logs`,
130
+ connector: (node) => import_rx_react.Rx.make((get) => (0, import_effect.pipe)(get(node), import_effect.Option.flatMap((node2) => import_echo.Obj.instanceOf(import_assistant.Blueprint, node2.data) ? import_effect.Option.some(node2) : import_effect.Option.none()), import_effect.Option.map((node2) => [
131
+ {
132
+ id: [
133
+ node2.id,
134
+ "logs"
135
+ ].join(import_types.ATTENDABLE_PATH_SEPARATOR),
136
+ type: import_types.PLANK_COMPANION_TYPE,
137
+ data: "logs",
138
+ properties: {
139
+ label: [
140
+ "blueprint logs label",
141
+ {
142
+ ns: import_chunk_P74TWGMG.ASSISTANT_PLUGIN
143
+ }
144
+ ],
145
+ icon: "ph--clock-countdown--regular",
146
+ disposition: "hidden"
147
+ }
148
+ }
149
+ ]), import_effect.Option.getOrElse(() => [])))
150
+ }),
140
151
  (0, import_plugin_graph.createExtension)({
141
152
  id: `${import_chunk_P74TWGMG.ASSISTANT_PLUGIN}/root`,
142
153
  connector: (node) => {
143
154
  let query;
144
155
  return import_rx_react.Rx.make((get) => (0, import_effect.pipe)(get(node), import_effect.Option.flatMap((node2) => node2.type === import_types2.SPACE_TYPE && (0, import_echo2.isSpace)(node2.data) ? import_effect.Option.some(node2.data) : import_effect.Option.none()), import_effect.Option.map((space) => {
145
156
  if (!query) {
146
- query = space.db.query(import_echo2.Query.type(import_chunk_7TQAIKE2.TemplateType));
157
+ query = space.db.query(import_echo2.Query.type(import_chunk_LMDJEGZ2.TemplateType));
147
158
  }
148
159
  const templates = get((0, import_plugin_space.rxFromQuery)(query));
149
160
  return templates.length > 0 ? [
@@ -172,7 +183,7 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
172
183
  let query;
173
184
  return import_rx_react.Rx.make((get) => (0, import_effect.pipe)(get(node), import_effect.Option.flatMap((node2) => node2.id === `${import_chunk_P74TWGMG.ASSISTANT_PLUGIN}/templates` && (0, import_echo2.isSpace)(node2.properties.space) ? import_effect.Option.some(node2.properties.space) : import_effect.Option.none()), import_effect.Option.map((space) => {
174
185
  if (!query) {
175
- query = space.db.query(import_echo2.Query.type(import_chunk_7TQAIKE2.TemplateType));
186
+ query = space.db.query(import_echo2.Query.type(import_chunk_LMDJEGZ2.TemplateType));
176
187
  }
177
188
  return get((0, import_plugin_space.rxFromQuery)(query)).toSorted((a, b) => {
178
189
  const nameA = a.name ?? "";
@@ -197,16 +208,18 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
197
208
  })
198
209
  ]);
199
210
  var getOrCreateChat = async (dispatch, space) => {
200
- const { objects } = await space.db.query(import_echo2.Filter.type(import_chunk_7TQAIKE2.AIChatType)).run();
201
- if (objects.length > 0) {
202
- return objects[objects.length - 1];
211
+ const { objects: allChats } = await space.db.query(import_echo2.Query.type(import_chunk_LMDJEGZ2.AIChatType)).run();
212
+ const { objects: relatedChats } = await space.db.query(import_echo2.Query.type(import_chunk_LMDJEGZ2.AIChatType).sourceOf(import_chunk_LMDJEGZ2.CompanionTo).source()).run();
213
+ const chats = allChats.filter((chat) => !relatedChats.includes(chat));
214
+ if (chats.length > 0) {
215
+ return chats[chats.length - 1];
203
216
  }
204
- const { data } = await dispatch((0, import_app_framework.createIntent)(import_chunk_7TQAIKE2.AssistantAction.CreateChat, {
217
+ const { data } = await dispatch((0, import_app_framework.createIntent)(import_chunk_LMDJEGZ2.AssistantAction.CreateChat, {
205
218
  space
206
219
  }));
207
- (0, import_invariant.invariant)(import_echo.Obj.instanceOf(import_chunk_7TQAIKE2.AIChatType, data?.object), void 0, {
220
+ (0, import_invariant.invariant)(import_echo.Obj.instanceOf(import_chunk_LMDJEGZ2.AIChatType, data?.object), void 0, {
208
221
  F: __dxlog_file,
209
- L: 233,
222
+ L: 245,
210
223
  S: void 0,
211
224
  A: [
212
225
  "Obj.instanceOf(AIChatType, data?.object)",
@@ -219,4 +232,4 @@ var getOrCreateChat = async (dispatch, space) => {
219
232
  }));
220
233
  return data.object;
221
234
  };
222
- //# sourceMappingURL=app-graph-builder-VEPLBTML.cjs.map
235
+ //# sourceMappingURL=app-graph-builder-PPR5B5KU.cjs.map