@dxos/assistant-toolkit 0.8.4-main.1068cf700f
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/LICENSE +8 -0
- package/README.md +3 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +3708 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/testing/index.mjs +44 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/blueprints/design/design-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/design/design-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/design/design-blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/design/design-blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/design/index.d.ts +3 -0
- package/dist/types/src/blueprints/design/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/discord-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/discord/discord-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/index.d.ts +3 -0
- package/dist/types/src/blueprints/discord/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/index.d.ts +8 -0
- package/dist/types/src/blueprints/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/index.d.ts +3 -0
- package/dist/types/src/blueprints/linear/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/linear-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/linear/linear-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/markdown/index.d.ts +3 -0
- package/dist/types/src/blueprints/markdown/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/markdown/markdown-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/markdown/markdown-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/index.d.ts +3 -0
- package/dist/types/src/blueprints/planning/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/planning-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/planning/planning-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/research/index.d.ts +3 -0
- package/dist/types/src/blueprints/research/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/research/research-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/research/research-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/research/research-blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/research/research-blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/testing.d.ts +10 -0
- package/dist/types/src/blueprints/testing.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/index.d.ts +4 -0
- package/dist/types/src/blueprints/websearch/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/websearch-toolkit.d.ts +27 -0
- package/dist/types/src/blueprints/websearch/websearch-toolkit.d.ts.map +1 -0
- package/dist/types/src/chat/Chat.d.ts +31 -0
- package/dist/types/src/chat/Chat.d.ts.map +1 -0
- package/dist/types/src/chat/index.d.ts +2 -0
- package/dist/types/src/chat/index.d.ts.map +1 -0
- package/dist/types/src/crud/graph.d.ts +67 -0
- package/dist/types/src/crud/graph.d.ts.map +1 -0
- package/dist/types/src/crud/graph.test.d.ts +2 -0
- package/dist/types/src/crud/graph.test.d.ts.map +1 -0
- package/dist/types/src/crud/index.d.ts +2 -0
- package/dist/types/src/crud/index.d.ts.map +1 -0
- package/dist/types/src/experimental/feed.test.d.ts +2 -0
- package/dist/types/src/experimental/feed.test.d.ts.map +1 -0
- package/dist/types/src/functions/agent/index.d.ts +5 -0
- package/dist/types/src/functions/agent/index.d.ts.map +1 -0
- package/dist/types/src/functions/agent/prompt.d.ts +76 -0
- package/dist/types/src/functions/agent/prompt.d.ts.map +1 -0
- package/dist/types/src/functions/discord/fetch-messages.d.ts +11 -0
- package/dist/types/src/functions/discord/fetch-messages.d.ts.map +1 -0
- package/dist/types/src/functions/discord/fetch-messages.test.d.ts +2 -0
- package/dist/types/src/functions/discord/fetch-messages.test.d.ts.map +1 -0
- package/dist/types/src/functions/discord/index.d.ts +12 -0
- package/dist/types/src/functions/discord/index.d.ts.map +1 -0
- package/dist/types/src/functions/document/create.d.ts +6 -0
- package/dist/types/src/functions/document/create.d.ts.map +1 -0
- package/dist/types/src/functions/document/index.d.ts +30 -0
- package/dist/types/src/functions/document/index.d.ts.map +1 -0
- package/dist/types/src/functions/document/read.d.ts +14 -0
- package/dist/types/src/functions/document/read.d.ts.map +1 -0
- package/dist/types/src/functions/document/update.d.ts +13 -0
- package/dist/types/src/functions/document/update.d.ts.map +1 -0
- package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts +174 -0
- package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts.map +1 -0
- package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts +2 -0
- package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts.map +1 -0
- package/dist/types/src/functions/entity-extraction/index.d.ts +175 -0
- package/dist/types/src/functions/entity-extraction/index.d.ts.map +1 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337321991.d.ts +38 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337321991.d.ts.map +1 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337331526.d.ts +37 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337331526.d.ts.map +1 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337344119.d.ts +58 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337344119.d.ts.map +1 -0
- package/dist/types/src/functions/exa/data/index.d.ts +3 -0
- package/dist/types/src/functions/exa/data/index.d.ts.map +1 -0
- package/dist/types/src/functions/exa/exa.d.ts +5 -0
- package/dist/types/src/functions/exa/exa.d.ts.map +1 -0
- package/dist/types/src/functions/exa/index.d.ts +3 -0
- package/dist/types/src/functions/exa/index.d.ts.map +1 -0
- package/dist/types/src/functions/exa/mock.d.ts +5 -0
- package/dist/types/src/functions/exa/mock.d.ts.map +1 -0
- package/dist/types/src/functions/github/fetch-prs.d.ts +6 -0
- package/dist/types/src/functions/github/fetch-prs.d.ts.map +1 -0
- package/dist/types/src/functions/index.d.ts +8 -0
- package/dist/types/src/functions/index.d.ts.map +1 -0
- package/dist/types/src/functions/linear/index.d.ts +9 -0
- package/dist/types/src/functions/linear/index.d.ts.map +1 -0
- package/dist/types/src/functions/linear/linear.test.d.ts +2 -0
- package/dist/types/src/functions/linear/linear.test.d.ts.map +1 -0
- package/dist/types/src/functions/linear/sync-issues.d.ts +12 -0
- package/dist/types/src/functions/linear/sync-issues.d.ts.map +1 -0
- package/dist/types/src/functions/research/document-create.d.ts +9 -0
- package/dist/types/src/functions/research/document-create.d.ts.map +1 -0
- package/dist/types/src/functions/research/index.d.ts +21 -0
- package/dist/types/src/functions/research/index.d.ts.map +1 -0
- package/dist/types/src/functions/research/research-graph.d.ts +19 -0
- package/dist/types/src/functions/research/research-graph.d.ts.map +1 -0
- package/dist/types/src/functions/research/research.d.ts +14 -0
- package/dist/types/src/functions/research/research.d.ts.map +1 -0
- package/dist/types/src/functions/research/research.test.d.ts +2 -0
- package/dist/types/src/functions/research/research.test.d.ts.map +1 -0
- package/dist/types/src/functions/research/types.d.ts +6 -0
- package/dist/types/src/functions/research/types.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/index.d.ts +29 -0
- package/dist/types/src/functions/tasks/index.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/read.d.ts +14 -0
- package/dist/types/src/functions/tasks/read.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/task-list.d.ts +74 -0
- package/dist/types/src/functions/tasks/task-list.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/task-list.test.d.ts +2 -0
- package/dist/types/src/functions/tasks/task-list.test.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/update.d.ts +16 -0
- package/dist/types/src/functions/tasks/update.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +9 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/initiative/Initiative.d.ts +41 -0
- package/dist/types/src/initiative/Initiative.d.ts.map +1 -0
- package/dist/types/src/initiative/blueprint.d.ts +153 -0
- package/dist/types/src/initiative/blueprint.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/addArtifact.d.ts +6 -0
- package/dist/types/src/initiative/functions/addArtifact.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/agent.d.ts +62 -0
- package/dist/types/src/initiative/functions/agent.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/getContext.d.ts +13 -0
- package/dist/types/src/initiative/functions/getContext.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/index.d.ts +5 -0
- package/dist/types/src/initiative/functions/index.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/qualifier.d.ts +60 -0
- package/dist/types/src/initiative/functions/qualifier.d.ts.map +1 -0
- package/dist/types/src/initiative/index.d.ts +6 -0
- package/dist/types/src/initiative/index.d.ts.map +1 -0
- package/dist/types/src/initiative/initiative.test.d.ts +2 -0
- package/dist/types/src/initiative/initiative.test.d.ts.map +1 -0
- package/dist/types/src/initiative/plan.d.ts +77 -0
- package/dist/types/src/initiative/plan.d.ts.map +1 -0
- package/dist/types/src/initiative/util.d.ts +29 -0
- package/dist/types/src/initiative/util.d.ts.map +1 -0
- package/dist/types/src/planning/blueprint.d.ts +18 -0
- package/dist/types/src/planning/blueprint.d.ts.map +1 -0
- package/dist/types/src/planning/functions/index.d.ts +2 -0
- package/dist/types/src/planning/functions/index.d.ts.map +1 -0
- package/dist/types/src/planning/functions/update-tasks.d.ts +9 -0
- package/dist/types/src/planning/functions/update-tasks.d.ts.map +1 -0
- package/dist/types/src/planning/index.d.ts +3 -0
- package/dist/types/src/planning/index.d.ts.map +1 -0
- package/dist/types/src/sync/index.d.ts +2 -0
- package/dist/types/src/sync/index.d.ts.map +1 -0
- package/dist/types/src/sync/sync.d.ts +15 -0
- package/dist/types/src/sync/sync.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/plugins.d.ts +19 -0
- package/dist/types/src/testing/plugins.d.ts.map +1 -0
- package/dist/types/src/toolkits/AssistantToolkit.d.ts +43 -0
- package/dist/types/src/toolkits/AssistantToolkit.d.ts.map +1 -0
- package/dist/types/src/toolkits/AssistantToolkit.test.d.ts +2 -0
- package/dist/types/src/toolkits/AssistantToolkit.test.d.ts.map +1 -0
- package/dist/types/src/toolkits/SystemToolkit.d.ts +99 -0
- package/dist/types/src/toolkits/SystemToolkit.d.ts.map +1 -0
- package/dist/types/src/toolkits/WebToolkit.d.ts +38 -0
- package/dist/types/src/toolkits/WebToolkit.d.ts.map +1 -0
- package/dist/types/src/toolkits/index.d.ts +4 -0
- package/dist/types/src/toolkits/index.d.ts.map +1 -0
- package/dist/types/src/util/graphql.d.ts +22 -0
- package/dist/types/src/util/graphql.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +2 -0
- package/dist/types/src/util/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +74 -0
- package/src/blueprints/design/design-blueprint.test.ts +100 -0
- package/src/blueprints/design/design-blueprint.ts +31 -0
- package/src/blueprints/design/index.ts +7 -0
- package/src/blueprints/discord/discord-blueprint.ts +32 -0
- package/src/blueprints/discord/index.ts +7 -0
- package/src/blueprints/index.ts +11 -0
- package/src/blueprints/linear/index.ts +7 -0
- package/src/blueprints/linear/linear-blueprint.ts +33 -0
- package/src/blueprints/markdown/index.ts +7 -0
- package/src/blueprints/markdown/markdown-blueprint.ts +24 -0
- package/src/blueprints/planning/index.ts +7 -0
- package/src/blueprints/planning/planning-blueprint.test.ts +120 -0
- package/src/blueprints/planning/planning-blueprint.ts +96 -0
- package/src/blueprints/research/index.ts +7 -0
- package/src/blueprints/research/research-blueprint.test.ts +7 -0
- package/src/blueprints/research/research-blueprint.ts +51 -0
- package/src/blueprints/testing.ts +30 -0
- package/src/blueprints/websearch/index.ts +9 -0
- package/src/blueprints/websearch/websearch-blueprint.ts +18 -0
- package/src/blueprints/websearch/websearch-toolkit.ts +8 -0
- package/src/chat/Chat.ts +45 -0
- package/src/chat/index.ts +5 -0
- package/src/crud/graph.test.ts +46 -0
- package/src/crud/graph.ts +380 -0
- package/src/crud/index.ts +5 -0
- package/src/experimental/feed.test.ts +106 -0
- package/src/functions/agent/index.ts +11 -0
- package/src/functions/agent/prompt.ts +116 -0
- package/src/functions/discord/fetch-messages.test.ts +54 -0
- package/src/functions/discord/fetch-messages.ts +252 -0
- package/src/functions/discord/index.ts +9 -0
- package/src/functions/document/create.ts +29 -0
- package/src/functions/document/index.ts +13 -0
- package/src/functions/document/read.ts +32 -0
- package/src/functions/document/update.ts +32 -0
- package/src/functions/entity-extraction/entity-extraction.conversations.json +1 -0
- package/src/functions/entity-extraction/entity-extraction.test.ts +74 -0
- package/src/functions/entity-extraction/entity-extraction.ts +181 -0
- package/src/functions/entity-extraction/index.ts +9 -0
- package/src/functions/exa/data/exa-search-1748337321991.ts +131 -0
- package/src/functions/exa/data/exa-search-1748337331526.ts +144 -0
- package/src/functions/exa/data/exa-search-1748337344119.ts +133 -0
- package/src/functions/exa/data/index.ts +11 -0
- package/src/functions/exa/exa.ts +37 -0
- package/src/functions/exa/index.ts +6 -0
- package/src/functions/exa/mock.ts +71 -0
- package/src/functions/github/fetch-prs.ts +31 -0
- package/src/functions/index.ts +11 -0
- package/src/functions/linear/index.ts +9 -0
- package/src/functions/linear/linear.test.ts +58 -0
- package/src/functions/linear/sync-issues.ts +191 -0
- package/src/functions/research/document-create.ts +73 -0
- package/src/functions/research/index.ts +14 -0
- package/src/functions/research/research-graph.ts +49 -0
- package/src/functions/research/research-instructions.tpl +106 -0
- package/src/functions/research/research.conversations.json +1 -0
- package/src/functions/research/research.test.ts +144 -0
- package/src/functions/research/research.ts +182 -0
- package/src/functions/research/types.ts +26 -0
- package/src/functions/tasks/index.ts +11 -0
- package/src/functions/tasks/read.ts +34 -0
- package/src/functions/tasks/task-list.test.ts +99 -0
- package/src/functions/tasks/task-list.ts +165 -0
- package/src/functions/tasks/update.ts +52 -0
- package/src/index.ts +12 -0
- package/src/initiative/Initiative.ts +61 -0
- package/src/initiative/blueprint.ts +60 -0
- package/src/initiative/functions/addArtifact.ts +41 -0
- package/src/initiative/functions/agent.ts +77 -0
- package/src/initiative/functions/getContext.ts +54 -0
- package/src/initiative/functions/index.ts +8 -0
- package/src/initiative/functions/qualifier.ts +98 -0
- package/src/initiative/index.ts +9 -0
- package/src/initiative/initiative.test.ts +584 -0
- package/src/initiative/plan.ts +107 -0
- package/src/initiative/util.ts +137 -0
- package/src/planning/blueprint.ts +14 -0
- package/src/planning/functions/index.ts +5 -0
- package/src/planning/functions/update-tasks.ts +168 -0
- package/src/planning/index.ts +6 -0
- package/src/sync/index.ts +5 -0
- package/src/sync/sync.ts +95 -0
- package/src/testing/index.ts +5 -0
- package/src/testing/plugins.tsx +69 -0
- package/src/toolkits/AssistantToolkit.conversations.json +1 -0
- package/src/toolkits/AssistantToolkit.test.ts +72 -0
- package/src/toolkits/AssistantToolkit.ts +70 -0
- package/src/toolkits/SystemToolkit.ts +299 -0
- package/src/toolkits/WebToolkit.ts +34 -0
- package/src/toolkits/index.ts +7 -0
- package/src/typedefs.d.ts +8 -0
- package/src/util/graphql.ts +31 -0
- package/src/util/index.ts +5 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
|
+
|
|
8
|
+
import { Database, Type } from '@dxos/echo';
|
|
9
|
+
import { defineFunction } from '@dxos/functions';
|
|
10
|
+
import { Markdown } from '@dxos/plugin-markdown/types';
|
|
11
|
+
|
|
12
|
+
import { MarkdownTasks, type TaskOperation } from './task-list';
|
|
13
|
+
|
|
14
|
+
export default defineFunction({
|
|
15
|
+
key: 'dxos.org/function/markdown/update-tasks',
|
|
16
|
+
name: 'Update markdown',
|
|
17
|
+
description: 'Creates and updates tasks in markdown documents.',
|
|
18
|
+
inputSchema: Schema.Struct({
|
|
19
|
+
doc: Type.Ref(Markdown.Document).annotations({
|
|
20
|
+
description: 'The ID of the document to update.',
|
|
21
|
+
}),
|
|
22
|
+
operations: Schema.optional(
|
|
23
|
+
Schema.Array(
|
|
24
|
+
Schema.Any.annotations({
|
|
25
|
+
description: 'Task operations to apply.',
|
|
26
|
+
}),
|
|
27
|
+
),
|
|
28
|
+
),
|
|
29
|
+
}),
|
|
30
|
+
outputSchema: Schema.Struct({
|
|
31
|
+
content: Schema.String,
|
|
32
|
+
numberedContent: Schema.String.annotations({
|
|
33
|
+
description: 'Content with line numbers for agent reference.',
|
|
34
|
+
}),
|
|
35
|
+
}),
|
|
36
|
+
handler: Effect.fn(function* ({ data: { doc, operations = [] } }) {
|
|
37
|
+
const document = yield* Database.load(doc);
|
|
38
|
+
|
|
39
|
+
// Create task manager and apply operations if provided.
|
|
40
|
+
const { content } = yield* Database.load(document.content);
|
|
41
|
+
const taskManager = new MarkdownTasks(content);
|
|
42
|
+
if (operations.length > 0) {
|
|
43
|
+
taskManager.applyOperations(operations as TaskOperation[]);
|
|
44
|
+
// TODO: Update the document content when database operations are fixed.
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
content: taskManager.getRawContent(),
|
|
49
|
+
numberedContent: taskManager.getNumberedContent(),
|
|
50
|
+
};
|
|
51
|
+
}),
|
|
52
|
+
});
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export * from './blueprints';
|
|
6
|
+
export * from './chat';
|
|
7
|
+
export * from './crud';
|
|
8
|
+
export * from './functions';
|
|
9
|
+
export * as Initiative from './initiative';
|
|
10
|
+
export * from './sync';
|
|
11
|
+
export * from './toolkits';
|
|
12
|
+
export * as Planning from './planning';
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { Type } from '@dxos/echo';
|
|
8
|
+
import { Queue } from '@dxos/echo-db';
|
|
9
|
+
import { QueueAnnotation, Text } from '@dxos/schema';
|
|
10
|
+
|
|
11
|
+
import * as Chat from '../chat/Chat';
|
|
12
|
+
|
|
13
|
+
import { Plan } from './plan';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Initiative schema definition.
|
|
17
|
+
*/
|
|
18
|
+
export const Initiative = Schema.Struct({
|
|
19
|
+
name: Schema.String,
|
|
20
|
+
|
|
21
|
+
spec: Type.Ref(Text.Text),
|
|
22
|
+
plan: Type.Ref(Plan),
|
|
23
|
+
|
|
24
|
+
artifacts: Schema.Array(
|
|
25
|
+
Schema.Struct({
|
|
26
|
+
// TODO(dmaretskyi): Consider gettings names from the artifact itself using Obj.getLabel.
|
|
27
|
+
name: Schema.String,
|
|
28
|
+
data: Type.Ref(Type.Obj),
|
|
29
|
+
}),
|
|
30
|
+
),
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Incoming queue that the agent processes.
|
|
34
|
+
*/
|
|
35
|
+
// NOTE: Named `queue` to conform to subscribable schema (see QueueAnnotation).
|
|
36
|
+
queue: Schema.optional(Type.Ref(Queue)),
|
|
37
|
+
|
|
38
|
+
// TODO(dmaretskyi): Multiple chats.
|
|
39
|
+
chat: Schema.optional(Type.Ref(Chat.Chat)),
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Objects to subscribe to.
|
|
43
|
+
* References to objects with a a canonical queue property.
|
|
44
|
+
* Schema must have the QueueAnnotation.
|
|
45
|
+
*/
|
|
46
|
+
// TODO(dmaretskyi): Turn into an array of objects when form-data
|
|
47
|
+
subscriptions: Schema.Array(Type.Ref(Type.Obj)),
|
|
48
|
+
|
|
49
|
+
useQualifyingAgent: Schema.optional(Schema.Boolean),
|
|
50
|
+
|
|
51
|
+
newChatOnEveryEvent: Schema.optional(Schema.Boolean),
|
|
52
|
+
|
|
53
|
+
// TODO(dmaretskyi): input queue?
|
|
54
|
+
}).pipe(
|
|
55
|
+
Type.object({
|
|
56
|
+
typename: 'dxos.org/type/Initiative',
|
|
57
|
+
version: '0.1.0',
|
|
58
|
+
}),
|
|
59
|
+
QueueAnnotation.set(true),
|
|
60
|
+
);
|
|
61
|
+
export interface Initiative extends Schema.Schema.Type<typeof Initiative> {}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Blueprint, Template } from '@dxos/blueprints';
|
|
6
|
+
import { trim } from '@dxos/util';
|
|
7
|
+
|
|
8
|
+
import { addArtifact, agent, getContext, qualifier } from './functions';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Get all initiative functions. This is a function to avoid circular dependency issues.
|
|
12
|
+
*/
|
|
13
|
+
export const getFunctions = () => [getContext, addArtifact, agent, qualifier];
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Creates the Initiative blueprint. This is a function to avoid circular dependency issues.
|
|
17
|
+
*/
|
|
18
|
+
export const makeBlueprint = () =>
|
|
19
|
+
Blueprint.make({
|
|
20
|
+
key: 'dxos.org/blueprint/initiative',
|
|
21
|
+
name: 'Initiative blueprint',
|
|
22
|
+
instructions: Template.make({
|
|
23
|
+
source: trim`
|
|
24
|
+
You work on an initiative. Each initiative has a spec - the goal of the initiative.
|
|
25
|
+
The initiative plan shows the current progress of the initiative.
|
|
26
|
+
Initiative has an number of associated artifacts you can read/write.
|
|
27
|
+
Spec and plan are also artifacts.
|
|
28
|
+
You can edit them if necessary.
|
|
29
|
+
|
|
30
|
+
IMPORTANT: When create a new artifact, always add it to the initiative using the add-artifact function.
|
|
31
|
+
|
|
32
|
+
{{#with initiative}}
|
|
33
|
+
<initiative id="{{id}}" name="{{name}}">
|
|
34
|
+
<spec>
|
|
35
|
+
{{spec}}
|
|
36
|
+
</spec>
|
|
37
|
+
<plan>
|
|
38
|
+
{{plan}}
|
|
39
|
+
</plan>
|
|
40
|
+
|
|
41
|
+
<artifacts>
|
|
42
|
+
{{#each artifacts}}
|
|
43
|
+
<artifact type="{{type}}" dxn="{{dxn}}">
|
|
44
|
+
{{name}}
|
|
45
|
+
</artifact>
|
|
46
|
+
{{/each}}
|
|
47
|
+
</artifacts>
|
|
48
|
+
</initiative>
|
|
49
|
+
{{/with}}
|
|
50
|
+
`,
|
|
51
|
+
inputs: [
|
|
52
|
+
{
|
|
53
|
+
name: 'initiative',
|
|
54
|
+
kind: 'function',
|
|
55
|
+
function: 'dxos.org/function/initiative/get-context',
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
}),
|
|
59
|
+
tools: Blueprint.toolDefinitions({ functions: [addArtifact] }),
|
|
60
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
|
+
|
|
8
|
+
import { AiContextService } from '@dxos/assistant';
|
|
9
|
+
import { Database, Obj, Type } from '@dxos/echo';
|
|
10
|
+
import { defineFunction } from '@dxos/functions';
|
|
11
|
+
|
|
12
|
+
import { getFromChatContext } from '../util';
|
|
13
|
+
|
|
14
|
+
export default defineFunction({
|
|
15
|
+
key: 'dxos.org/function/initiative/add-artifact',
|
|
16
|
+
name: 'Add artifact',
|
|
17
|
+
description: 'Adds a new artifact.',
|
|
18
|
+
inputSchema: Schema.Struct({
|
|
19
|
+
name: Schema.String.annotations({
|
|
20
|
+
description: 'The name of the artifact to add.',
|
|
21
|
+
}),
|
|
22
|
+
artifact: Type.Ref(Type.Obj).annotations({
|
|
23
|
+
description: 'The artifact to add. Do NOT guess or try to generate the ID.',
|
|
24
|
+
}),
|
|
25
|
+
}),
|
|
26
|
+
services: [AiContextService],
|
|
27
|
+
handler: Effect.fnUntraced(function* ({ data }) {
|
|
28
|
+
if (!(yield* Database.load(data.artifact))) {
|
|
29
|
+
throw new Error('Artifact not found.');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const initiative = yield* getFromChatContext;
|
|
33
|
+
|
|
34
|
+
Obj.change(initiative, (initiative) => {
|
|
35
|
+
initiative.artifacts.push({
|
|
36
|
+
name: data.name,
|
|
37
|
+
data: data.artifact,
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}, AiContextService.fixFunctionHandlerType),
|
|
41
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
|
+
|
|
8
|
+
import { AiService } from '@dxos/ai';
|
|
9
|
+
import { AiContextService, AiConversation, type ContextBinding } from '@dxos/assistant';
|
|
10
|
+
import { Database, Obj, Type } from '@dxos/echo';
|
|
11
|
+
import { type Queue } from '@dxos/echo-db';
|
|
12
|
+
import { acquireReleaseResource } from '@dxos/effect';
|
|
13
|
+
import { TriggerEvent, defineFunction } from '@dxos/functions';
|
|
14
|
+
import { invariant } from '@dxos/invariant';
|
|
15
|
+
import { type Message } from '@dxos/types';
|
|
16
|
+
|
|
17
|
+
import * as Initiative from '../Initiative';
|
|
18
|
+
import { resetChatHistory } from '../util';
|
|
19
|
+
|
|
20
|
+
export default defineFunction({
|
|
21
|
+
key: 'dxos.org/function/initiative/agent',
|
|
22
|
+
name: 'Initiative Agent',
|
|
23
|
+
description: 'Agentic worker that drives the initiative autonomously.',
|
|
24
|
+
inputSchema: Schema.Struct({
|
|
25
|
+
initiative: Schema.suspend(() => Type.Ref(Initiative.Initiative)),
|
|
26
|
+
prompt: Schema.optional(Schema.String),
|
|
27
|
+
event: Schema.optional(TriggerEvent.TriggerEvent),
|
|
28
|
+
}),
|
|
29
|
+
outputSchema: Schema.Void,
|
|
30
|
+
services: [AiContextService],
|
|
31
|
+
handler: Effect.fnUntraced(
|
|
32
|
+
function* ({ data }) {
|
|
33
|
+
const initiative = yield* Database.load(data.initiative);
|
|
34
|
+
invariant(Obj.instanceOf(Initiative.Initiative, initiative));
|
|
35
|
+
invariant(initiative.chat, 'Initiative has no chat.');
|
|
36
|
+
|
|
37
|
+
if (initiative.newChatOnEveryEvent) {
|
|
38
|
+
yield* resetChatHistory(initiative);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const chatQueue = yield* initiative.chat.pipe(
|
|
42
|
+
Database.load,
|
|
43
|
+
Effect.flatMap((chat) => Database.load(chat.queue)),
|
|
44
|
+
);
|
|
45
|
+
invariant(chatQueue, 'Initiative chat queue not found.');
|
|
46
|
+
const conversation = yield* acquireReleaseResource(
|
|
47
|
+
() => new AiConversation({ queue: chatQueue as Queue<Message.Message | ContextBinding> }),
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const iniativesInContext = conversation.context.getObjects().filter(Obj.instanceOf(Initiative.Initiative));
|
|
51
|
+
if (iniativesInContext.length !== 1) {
|
|
52
|
+
throw new Error('There should be exactly one initiative in context. Got: ' + iniativesInContext.length);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!data.prompt && !data.event) {
|
|
56
|
+
throw new Error('Either prompt or event must be provided.');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
let input = '';
|
|
60
|
+
if (data.prompt) {
|
|
61
|
+
input += `${data.prompt}\n\n`;
|
|
62
|
+
}
|
|
63
|
+
if (data.event) {
|
|
64
|
+
input += `<event>\n${JSON.stringify(data.event, null, 2)}\n</event>\n\n`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
yield* conversation
|
|
68
|
+
.createRequest({
|
|
69
|
+
prompt: input,
|
|
70
|
+
})
|
|
71
|
+
.pipe(Effect.retry({ times: 2 }));
|
|
72
|
+
},
|
|
73
|
+
Effect.scoped,
|
|
74
|
+
Effect.provide(AiService.model('@anthropic/claude-sonnet-4-5')),
|
|
75
|
+
AiContextService.fixFunctionHandlerType,
|
|
76
|
+
) as any,
|
|
77
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
|
+
|
|
8
|
+
import { AiContextService } from '@dxos/assistant';
|
|
9
|
+
import { Database, Obj } from '@dxos/echo';
|
|
10
|
+
import { defineFunction } from '@dxos/functions';
|
|
11
|
+
|
|
12
|
+
import { formatPlan } from '../plan';
|
|
13
|
+
import { getFromChatContext } from '../util';
|
|
14
|
+
|
|
15
|
+
export default defineFunction({
|
|
16
|
+
key: 'dxos.org/function/initiative/get-context',
|
|
17
|
+
name: 'Get Initiative Context',
|
|
18
|
+
description: 'Get the context of an initiative.',
|
|
19
|
+
inputSchema: Schema.Struct({}),
|
|
20
|
+
outputSchema: Schema.Struct({
|
|
21
|
+
id: Schema.String,
|
|
22
|
+
name: Schema.String,
|
|
23
|
+
spec: Schema.String,
|
|
24
|
+
plan: Schema.String,
|
|
25
|
+
artifacts: Schema.Array(
|
|
26
|
+
Schema.Struct({
|
|
27
|
+
name: Schema.String,
|
|
28
|
+
type: Schema.optional(Schema.String),
|
|
29
|
+
dxn: Schema.optional(Schema.String),
|
|
30
|
+
}),
|
|
31
|
+
),
|
|
32
|
+
}),
|
|
33
|
+
services: [AiContextService],
|
|
34
|
+
handler: Effect.fnUntraced(function* ({ data: _data }) {
|
|
35
|
+
const initiative = yield* getFromChatContext;
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
id: initiative.id,
|
|
39
|
+
name: initiative.name,
|
|
40
|
+
spec: yield* initiative.spec.pipe(Database.load).pipe(Effect.map((_) => _.content)),
|
|
41
|
+
plan: yield* initiative.plan?.pipe(Database.load).pipe(Effect.map(formatPlan)) ??
|
|
42
|
+
Effect.succeed('No plan found.'),
|
|
43
|
+
artifacts: yield* Effect.forEach(initiative.artifacts, (artifact) =>
|
|
44
|
+
Effect.gen(function* () {
|
|
45
|
+
return {
|
|
46
|
+
name: artifact.name,
|
|
47
|
+
type: Obj.getTypename(yield* Database.load(artifact.data)),
|
|
48
|
+
dxn: artifact.data.dxn.toString(),
|
|
49
|
+
};
|
|
50
|
+
}),
|
|
51
|
+
),
|
|
52
|
+
};
|
|
53
|
+
}, AiContextService.fixFunctionHandlerType),
|
|
54
|
+
});
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as LanguageModel from '@effect/ai/LanguageModel';
|
|
6
|
+
import * as Prompt from '@effect/ai/Prompt';
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as Schema from 'effect/Schema';
|
|
9
|
+
|
|
10
|
+
import { AiService } from '@dxos/ai';
|
|
11
|
+
import { Database, Obj, Ref, Type } from '@dxos/echo';
|
|
12
|
+
import { TriggerEvent, defineFunction } from '@dxos/functions';
|
|
13
|
+
import { invariant } from '@dxos/invariant';
|
|
14
|
+
import { trim } from '@dxos/util';
|
|
15
|
+
|
|
16
|
+
import * as Initiative from '../Initiative';
|
|
17
|
+
import { formatPlan } from '../plan';
|
|
18
|
+
|
|
19
|
+
export default defineFunction({
|
|
20
|
+
key: 'dxos.org/function/initiative/qualifier',
|
|
21
|
+
name: 'Initiative Qualifier',
|
|
22
|
+
description:
|
|
23
|
+
'Qualifier that determines if the event is relevant to the initiative. Puts the data into the input queue of the initiative.',
|
|
24
|
+
inputSchema: Schema.Struct({
|
|
25
|
+
initiative: Schema.suspend(() => Type.Ref(Initiative.Initiative)),
|
|
26
|
+
event: TriggerEvent.TriggerEvent,
|
|
27
|
+
}),
|
|
28
|
+
outputSchema: Schema.Void,
|
|
29
|
+
services: [],
|
|
30
|
+
handler: Effect.fnUntraced(
|
|
31
|
+
function* ({ data }) {
|
|
32
|
+
const initiative = yield* Database.load(data.initiative);
|
|
33
|
+
invariant(Obj.instanceOf(Initiative.Initiative, initiative));
|
|
34
|
+
invariant(initiative.chat, 'Initiative has no chat.');
|
|
35
|
+
|
|
36
|
+
const { id, name, queue } = initiative;
|
|
37
|
+
if (!queue) {
|
|
38
|
+
throw new Error('Initiative has no queue.');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const plan = yield* Database.load(initiative.plan);
|
|
42
|
+
const spec = yield* Database.load(initiative.spec);
|
|
43
|
+
|
|
44
|
+
const {
|
|
45
|
+
value: { isRelevant },
|
|
46
|
+
} = yield* LanguageModel.generateObject({
|
|
47
|
+
schema: Schema.Struct({
|
|
48
|
+
isRelevant: Schema.Boolean,
|
|
49
|
+
}),
|
|
50
|
+
prompt: Prompt.fromMessages([
|
|
51
|
+
Prompt.systemMessage({
|
|
52
|
+
content: trim`
|
|
53
|
+
You are a qualifying agent that determines if the event is relevant to the initiative.
|
|
54
|
+
Respond with true if the event is relevant to the initiative, false otherwise.
|
|
55
|
+
If you are not sure, return true.
|
|
56
|
+
The qualified events will be forwarded to the larger agent that will process them.
|
|
57
|
+
<initiative id="${id}" name="${name}">
|
|
58
|
+
<spec>
|
|
59
|
+
${spec.content}
|
|
60
|
+
</spec>
|
|
61
|
+
<plan>
|
|
62
|
+
${formatPlan(plan)}
|
|
63
|
+
</plan>
|
|
64
|
+
</initiative>
|
|
65
|
+
`,
|
|
66
|
+
}),
|
|
67
|
+
Prompt.userMessage({
|
|
68
|
+
content: [
|
|
69
|
+
Prompt.makePart('text', {
|
|
70
|
+
text: trim`
|
|
71
|
+
<event>
|
|
72
|
+
${JSON.stringify(data.event, null, 2)}
|
|
73
|
+
</event>
|
|
74
|
+
`,
|
|
75
|
+
}),
|
|
76
|
+
],
|
|
77
|
+
}),
|
|
78
|
+
]),
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
if (isRelevant) {
|
|
82
|
+
const queueTarget = yield* Database.load(queue);
|
|
83
|
+
|
|
84
|
+
if ('queue' in data.event && data.event.item) {
|
|
85
|
+
const obj = data.event.item;
|
|
86
|
+
yield* Effect.promise(() => queueTarget.append([obj]));
|
|
87
|
+
} else if ('subject' in data.event && Ref.isRef(data.event.subject)) {
|
|
88
|
+
const obj = yield* Database.load(data.event.subject);
|
|
89
|
+
yield* Effect.promise(() => queueTarget.append([obj]));
|
|
90
|
+
} else {
|
|
91
|
+
throw new Error('Invalid event.');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
Effect.scoped,
|
|
96
|
+
Effect.provide(AiService.model('@anthropic/claude-sonnet-4-5')),
|
|
97
|
+
),
|
|
98
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export { Initiative } from './Initiative';
|
|
6
|
+
export { makeInitialized, resetChatHistory, getFromChatContext } from './util';
|
|
7
|
+
export { getFunctions, makeBlueprint } from './blueprint';
|
|
8
|
+
export * from './functions';
|
|
9
|
+
export * from './plan';
|