@dxos/plugin-attention 0.8.4-main.84f28bd → 0.8.4-main.8baae0fced
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 +102 -5
- package/README.md +1 -1
- package/dist/lib/neutral/AttentionPlugin.mjs +9 -0
- package/dist/lib/neutral/AttentionPlugin.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +11 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/neutral/chunk-DPUSNLAH.mjs +60 -0
- package/dist/lib/neutral/chunk-DPUSNLAH.mjs.map +7 -0
- package/dist/lib/neutral/chunk-DTGSOFCE.mjs +41 -0
- package/dist/lib/neutral/chunk-DTGSOFCE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QSTYRKHK.mjs +8 -0
- package/dist/lib/neutral/chunk-QSTYRKHK.mjs.map +7 -0
- package/dist/lib/neutral/chunk-TNTMPZ3O.mjs +19 -0
- package/dist/lib/neutral/chunk-TNTMPZ3O.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +15 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/keyboard-6CPNUR24.mjs +19 -0
- package/dist/lib/neutral/keyboard-6CPNUR24.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +7 -0
- package/dist/lib/neutral/meta.mjs.map +7 -0
- package/dist/lib/neutral/operation-handler-O5PDEBTC.mjs +11 -0
- package/dist/lib/neutral/operation-handler-O5PDEBTC.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +7 -0
- package/dist/lib/neutral/operations/index.mjs.map +7 -0
- package/dist/lib/neutral/plugin.mjs +15 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/{node-esm/react-context-SVXVOSRH.mjs → neutral/react-context-W7BGQDHK.mjs} +9 -11
- package/dist/lib/neutral/react-context-W7BGQDHK.mjs.map +7 -0
- package/dist/lib/neutral/select-CI2OLVWT.mjs +46 -0
- package/dist/lib/neutral/select-CI2OLVWT.mjs.map +7 -0
- package/dist/lib/neutral/testing.mjs +7 -0
- package/dist/lib/neutral/testing.mjs.map +7 -0
- package/dist/lib/neutral/types/index.mjs +11 -0
- package/dist/lib/neutral/types/index.mjs.map +7 -0
- package/dist/types/src/AttentionPlugin.d.ts +3 -1
- package/dist/types/src/AttentionPlugin.d.ts.map +1 -1
- package/dist/types/src/AttentionPlugin.test.d.ts +2 -0
- package/dist/types/src/AttentionPlugin.test.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +6 -4
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/keyboard.d.ts +3 -2
- package/dist/types/src/capabilities/keyboard.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-context.d.ts +4 -2
- package/dist/types/src/capabilities/react-context.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -3
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts +3 -0
- package/dist/types/src/operations/index.d.ts.map +1 -0
- package/dist/types/src/operations/select.d.ts +5 -0
- package/dist/types/src/operations/select.d.ts.map +1 -0
- package/dist/types/src/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/testing.d.ts +2 -0
- package/dist/types/src/testing.d.ts.map +1 -0
- package/dist/types/src/types/capabilities.d.ts +7 -0
- package/dist/types/src/types/capabilities.d.ts.map +1 -0
- package/dist/types/src/types/events.d.ts +5 -0
- package/dist/types/src/types/events.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +4 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/types/types.d.ts +32 -0
- package/dist/types/src/types/types.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +60 -22
- package/src/AttentionPlugin.test.ts +32 -0
- package/src/AttentionPlugin.ts +40 -33
- package/src/capabilities/index.ts +8 -5
- package/src/capabilities/keyboard.ts +15 -16
- package/src/capabilities/operation-handler.ts +16 -0
- package/src/capabilities/react-context.tsx +29 -24
- package/src/index.ts +1 -5
- package/src/meta.ts +10 -5
- package/src/operations/index.ts +7 -0
- package/src/operations/select.ts +43 -0
- package/src/plugin.ts +11 -0
- package/src/testing.ts +7 -0
- package/src/types/capabilities.ts +13 -0
- package/src/types/events.ts +11 -0
- package/src/types/index.ts +7 -0
- package/src/types/types.ts +21 -0
- package/dist/lib/browser/chunk-O6FNOKYX.mjs +0 -21
- package/dist/lib/browser/chunk-O6FNOKYX.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -81
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/keyboard-IYF35Z4E.mjs +0 -27
- package/dist/lib/browser/keyboard-IYF35Z4E.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/react-context-JVGQB2CO.mjs +0 -27
- package/dist/lib/browser/react-context-JVGQB2CO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SVV7GQYN.mjs +0 -23
- package/dist/lib/node-esm/chunk-SVV7GQYN.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -82
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/keyboard-GSUNGWNE.mjs +0 -28
- package/dist/lib/node-esm/keyboard-GSUNGWNE.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/react-context-SVXVOSRH.mjs.map +0 -7
- package/dist/types/src/capabilities/capabilities.d.ts +0 -6
- package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
- package/dist/types/src/events.d.ts +0 -4
- package/dist/types/src/events.d.ts.map +0 -1
- package/src/capabilities/capabilities.ts +0 -13
- package/src/events.ts +0 -11
package/package.json
CHANGED
|
@@ -1,48 +1,86 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-attention",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.8baae0fced",
|
|
4
4
|
"description": "Plugin for attention",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
-
"
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
11
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
8
12
|
"author": "DXOS.org",
|
|
9
13
|
"sideEffects": true,
|
|
10
14
|
"type": "module",
|
|
15
|
+
"imports": {
|
|
16
|
+
"#capabilities": {
|
|
17
|
+
"source": "./src/capabilities/index.ts",
|
|
18
|
+
"types": "./dist/types/src/capabilities/index.d.ts",
|
|
19
|
+
"default": "./dist/lib/neutral/capabilities/index.mjs"
|
|
20
|
+
},
|
|
21
|
+
"#meta": {
|
|
22
|
+
"source": "./src/meta.ts",
|
|
23
|
+
"types": "./dist/types/src/meta.d.ts",
|
|
24
|
+
"default": "./dist/lib/neutral/meta.mjs"
|
|
25
|
+
},
|
|
26
|
+
"#operations": {
|
|
27
|
+
"source": "./src/operations/index.ts",
|
|
28
|
+
"types": "./dist/types/src/operations/index.d.ts",
|
|
29
|
+
"default": "./dist/lib/neutral/operations/index.mjs"
|
|
30
|
+
},
|
|
31
|
+
"#plugin": {
|
|
32
|
+
"source": "./src/AttentionPlugin.ts",
|
|
33
|
+
"types": "./dist/types/src/AttentionPlugin.d.ts",
|
|
34
|
+
"default": "./dist/lib/neutral/AttentionPlugin.mjs"
|
|
35
|
+
},
|
|
36
|
+
"#types": {
|
|
37
|
+
"source": "./src/types/index.ts",
|
|
38
|
+
"types": "./dist/types/src/types/index.d.ts",
|
|
39
|
+
"default": "./dist/lib/neutral/types/index.mjs"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
11
42
|
"exports": {
|
|
12
43
|
".": {
|
|
44
|
+
"source": "./src/index.ts",
|
|
13
45
|
"types": "./dist/types/src/index.d.ts",
|
|
14
|
-
"
|
|
15
|
-
|
|
46
|
+
"default": "./dist/lib/neutral/index.mjs"
|
|
47
|
+
},
|
|
48
|
+
"./plugin": {
|
|
49
|
+
"source": "./src/plugin.ts",
|
|
50
|
+
"types": "./dist/types/src/plugin.d.ts",
|
|
51
|
+
"default": "./dist/lib/neutral/plugin.mjs"
|
|
52
|
+
},
|
|
53
|
+
"./testing": {
|
|
54
|
+
"source": "./src/testing.ts",
|
|
55
|
+
"types": "./dist/types/src/testing.d.ts",
|
|
56
|
+
"default": "./dist/lib/neutral/testing.mjs"
|
|
16
57
|
}
|
|
17
58
|
},
|
|
18
59
|
"types": "dist/types/src/index.d.ts",
|
|
19
|
-
"typesVersions": {
|
|
20
|
-
"*": {}
|
|
21
|
-
},
|
|
22
60
|
"files": [
|
|
23
61
|
"dist",
|
|
24
62
|
"src"
|
|
25
63
|
],
|
|
26
64
|
"dependencies": {
|
|
27
|
-
"
|
|
28
|
-
"@
|
|
29
|
-
"
|
|
30
|
-
"@dxos/
|
|
31
|
-
"@dxos/
|
|
32
|
-
"@dxos/
|
|
33
|
-
"@dxos/
|
|
34
|
-
"@dxos/
|
|
35
|
-
"@dxos/
|
|
65
|
+
"effect": "3.20.0",
|
|
66
|
+
"@dxos/app-toolkit": "0.8.4-main.8baae0fced",
|
|
67
|
+
"@dxos/app-framework": "0.8.4-main.8baae0fced",
|
|
68
|
+
"@dxos/compute": "0.8.4-main.8baae0fced",
|
|
69
|
+
"@dxos/plugin-graph": "0.8.4-main.8baae0fced",
|
|
70
|
+
"@dxos/keyboard": "0.8.4-main.8baae0fced",
|
|
71
|
+
"@dxos/react-ui-attention": "0.8.4-main.8baae0fced",
|
|
72
|
+
"@dxos/echo": "0.8.4-main.8baae0fced",
|
|
73
|
+
"@dxos/util": "0.8.4-main.8baae0fced"
|
|
36
74
|
},
|
|
37
75
|
"devDependencies": {
|
|
38
|
-
"@types/react": "~
|
|
39
|
-
"react": "~
|
|
40
|
-
"react-dom": "~
|
|
76
|
+
"@types/react": "~19.2.7",
|
|
77
|
+
"react": "~19.2.3",
|
|
78
|
+
"react-dom": "~19.2.3"
|
|
41
79
|
},
|
|
42
80
|
"peerDependencies": {
|
|
43
|
-
"effect": "
|
|
44
|
-
"react": "~
|
|
45
|
-
"react-dom": "~
|
|
81
|
+
"effect": "3.20.0",
|
|
82
|
+
"react": "~19.2.3",
|
|
83
|
+
"react-dom": "~19.2.3"
|
|
46
84
|
},
|
|
47
85
|
"publishConfig": {
|
|
48
86
|
"access": "public"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { ActivationEvents, ProcessManagerPlugin } from '@dxos/app-framework';
|
|
8
|
+
import { createTestApp } from '@dxos/app-framework/testing';
|
|
9
|
+
import { GraphPlugin } from '@dxos/plugin-graph/plugin';
|
|
10
|
+
|
|
11
|
+
import { AttentionPlugin } from '#plugin';
|
|
12
|
+
|
|
13
|
+
import { meta } from './meta';
|
|
14
|
+
|
|
15
|
+
const moduleId = (name: string) => `${meta.id}.module.${name}`;
|
|
16
|
+
|
|
17
|
+
describe('AttentionPlugin', () => {
|
|
18
|
+
test('modules activate on the expected events', async ({ expect }) => {
|
|
19
|
+
await using harness = await createTestApp({
|
|
20
|
+
plugins: [GraphPlugin(), ProcessManagerPlugin(), AttentionPlugin()],
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Modules expected to be active after a normal startup.
|
|
24
|
+
expect(harness.manager.getActive()).toEqual(
|
|
25
|
+
expect.arrayContaining([moduleId('attention'), moduleId('ReactContext'), moduleId('Keyboard')]),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
// OperationHandler fires lazily when an operation is invoked.
|
|
29
|
+
await harness.fire(ActivationEvents.SetupProcessManager);
|
|
30
|
+
expect(harness.manager.getActive()).toContain(moduleId('OperationHandler'));
|
|
31
|
+
});
|
|
32
|
+
});
|
package/src/AttentionPlugin.ts
CHANGED
|
@@ -2,40 +2,45 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import { ActivationEvent, ActivationEvents, Capabilities, Capability, Plugin } from '@dxos/app-framework';
|
|
8
|
+
import { AppActivationEvents, AppPlugin } from '@dxos/app-toolkit';
|
|
6
9
|
import { AttentionManager, SelectionManager } from '@dxos/react-ui-attention';
|
|
7
10
|
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
+
import { Keyboard, OperationHandler, ReactContext } from '#capabilities';
|
|
12
|
+
import { meta } from '#meta';
|
|
13
|
+
import { AttentionEvents } from '#types';
|
|
14
|
+
import { AttentionCapabilities } from '#types';
|
|
11
15
|
|
|
12
|
-
export const AttentionPlugin = ()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
16
|
+
export const AttentionPlugin = Plugin.define(meta).pipe(
|
|
17
|
+
AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),
|
|
18
|
+
Plugin.addModule({
|
|
19
|
+
id: 'attention',
|
|
20
|
+
activatesOn: ActivationEvents.Startup,
|
|
21
|
+
firesAfterActivation: [AttentionEvents.AttentionReady],
|
|
22
|
+
activate: () =>
|
|
23
|
+
Effect.gen(function* () {
|
|
24
|
+
const registry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
25
|
+
const attention = new AttentionManager(registry);
|
|
26
|
+
const selection = new SelectionManager(registry);
|
|
21
27
|
setupDevtools(attention);
|
|
22
28
|
return [
|
|
23
|
-
contributes(AttentionCapabilities.Attention, attention),
|
|
24
|
-
contributes(AttentionCapabilities.Selection, selection),
|
|
29
|
+
Capability.contributes(AttentionCapabilities.Attention, attention),
|
|
30
|
+
Capability.contributes(AttentionCapabilities.Selection, selection),
|
|
25
31
|
];
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
]);
|
|
32
|
+
}),
|
|
33
|
+
}),
|
|
34
|
+
Plugin.addModule({
|
|
35
|
+
activatesOn: ActivationEvents.Startup,
|
|
36
|
+
activate: ReactContext,
|
|
37
|
+
}),
|
|
38
|
+
Plugin.addModule({
|
|
39
|
+
activatesOn: ActivationEvent.allOf(AppActivationEvents.AppGraphReady, AttentionEvents.AttentionReady),
|
|
40
|
+
activate: Keyboard,
|
|
41
|
+
}),
|
|
42
|
+
Plugin.make,
|
|
43
|
+
);
|
|
39
44
|
|
|
40
45
|
const setupDevtools = (attention: AttentionManager) => {
|
|
41
46
|
(globalThis as any).composer ??= {};
|
|
@@ -45,15 +50,17 @@ const setupDevtools = (attention: AttentionManager) => {
|
|
|
45
50
|
return attention;
|
|
46
51
|
},
|
|
47
52
|
get attended() {
|
|
48
|
-
return attention.
|
|
53
|
+
return attention.getCurrent();
|
|
49
54
|
},
|
|
50
55
|
get currentSpace() {
|
|
51
|
-
for (const id of attention.
|
|
52
|
-
const
|
|
53
|
-
if (
|
|
54
|
-
return
|
|
56
|
+
for (const id of attention.getCurrent()) {
|
|
57
|
+
const segments = id.split('/');
|
|
58
|
+
if (segments.length > 1 && segments[1].length === 33) {
|
|
59
|
+
return segments[1];
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
62
|
},
|
|
58
63
|
};
|
|
59
64
|
};
|
|
65
|
+
|
|
66
|
+
export default AttentionPlugin;
|
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Capability } from '@dxos/app-framework';
|
|
6
|
+
import { OperationHandlerSet } from '@dxos/compute';
|
|
6
7
|
|
|
7
|
-
export const Keyboard = lazy(() => import('./keyboard'));
|
|
8
|
-
export const
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
export const Keyboard = Capability.lazy('Keyboard', () => import('./keyboard'));
|
|
9
|
+
export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
|
|
10
|
+
'OperationHandler',
|
|
11
|
+
() => import('./operation-handler'),
|
|
12
|
+
);
|
|
13
|
+
export const ReactContext = Capability.lazy('ReactContext', () => import('./react-context'));
|
|
@@ -2,25 +2,24 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
import { Option } from 'effect';
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
7
6
|
|
|
8
|
-
import { Capabilities
|
|
7
|
+
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
9
8
|
import { Keyboard } from '@dxos/keyboard';
|
|
10
9
|
|
|
11
|
-
import { AttentionCapabilities } from '
|
|
10
|
+
import { AttentionCapabilities } from '#types';
|
|
12
11
|
|
|
13
|
-
export default (
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
export default Capability.makeModule(
|
|
13
|
+
Effect.fnUntraced(function* () {
|
|
14
|
+
const attention = yield* Capability.get(AttentionCapabilities.Attention);
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
});
|
|
16
|
+
const unsubscribe = attention.subscribeCurrent((current) => {
|
|
17
|
+
const id = current[0];
|
|
18
|
+
if (id) {
|
|
19
|
+
Keyboard.singleton.setCurrentContext(id);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
}
|
|
23
|
+
return Capability.contributes(Capabilities.Null, null, () => Effect.sync(() => unsubscribe()));
|
|
24
|
+
}),
|
|
25
|
+
);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
8
|
+
import type { OperationHandlerSet } from '@dxos/compute';
|
|
9
|
+
|
|
10
|
+
import { AttentionOperationHandlerSet } from '#operations';
|
|
11
|
+
|
|
12
|
+
export default Capability.makeModule<OperationHandlerSet.OperationHandlerSet>(
|
|
13
|
+
Effect.fnUntraced(function* () {
|
|
14
|
+
return Capability.contributes(Capabilities.OperationHandler, AttentionOperationHandlerSet);
|
|
15
|
+
}),
|
|
16
|
+
);
|
|
@@ -2,33 +2,38 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
5
6
|
import React, { type PropsWithChildren } from 'react';
|
|
6
7
|
|
|
7
|
-
import { Capabilities,
|
|
8
|
+
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
9
|
+
import { useCapability } from '@dxos/app-framework/ui';
|
|
8
10
|
import { RootAttentionProvider, SelectionProvider } from '@dxos/react-ui-attention';
|
|
9
11
|
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
+
import { meta } from '#meta';
|
|
13
|
+
import { AttentionCapabilities } from '#types';
|
|
12
14
|
|
|
13
|
-
export default () =>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
export default Capability.makeModule(() =>
|
|
16
|
+
Effect.succeed(
|
|
17
|
+
Capability.contributes(Capabilities.ReactContext, {
|
|
18
|
+
id: meta.id,
|
|
19
|
+
context: (props: PropsWithChildren) => {
|
|
20
|
+
const attention = useCapability(AttentionCapabilities.Attention);
|
|
21
|
+
const selection = useCapability(AttentionCapabilities.Selection);
|
|
19
22
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
23
|
+
return (
|
|
24
|
+
<RootAttentionProvider
|
|
25
|
+
attention={attention}
|
|
26
|
+
onChange={(nextAttended) => {
|
|
27
|
+
// TODO(Zan): Workout why this was in deck plugin. It didn't seem to work?
|
|
28
|
+
// if (layout.values.scrollIntoView && nextAttended.has(layout.values.scrollIntoView)) {
|
|
29
|
+
// layout.values.scrollIntoView = undefined;
|
|
30
|
+
// }
|
|
31
|
+
}}
|
|
32
|
+
>
|
|
33
|
+
<SelectionProvider selection={selection}>{props.children}</SelectionProvider>
|
|
34
|
+
</RootAttentionProvider>
|
|
35
|
+
);
|
|
36
|
+
},
|
|
37
|
+
}),
|
|
38
|
+
),
|
|
39
|
+
);
|
package/src/index.ts
CHANGED
package/src/meta.ts
CHANGED
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { type
|
|
5
|
+
import { type Plugin } from '@dxos/app-framework';
|
|
6
|
+
import { trim } from '@dxos/util';
|
|
6
7
|
|
|
7
|
-
export const
|
|
8
|
-
|
|
9
|
-
export const meta: PluginMeta = {
|
|
10
|
-
id: ATTENTION_PLUGIN,
|
|
8
|
+
export const meta: Plugin.Meta = {
|
|
9
|
+
id: 'org.dxos.plugin.attention',
|
|
11
10
|
name: 'Attention',
|
|
11
|
+
author: 'DXOS',
|
|
12
|
+
description: trim`
|
|
13
|
+
Track and manage focused attention on objects across your workspace.
|
|
14
|
+
Highlight items requiring action and coordinate team focus on priority work.
|
|
15
|
+
`,
|
|
16
|
+
tags: ['system'],
|
|
12
17
|
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Match from 'effect/Match';
|
|
7
|
+
|
|
8
|
+
import { Capability } from '@dxos/app-framework';
|
|
9
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
10
|
+
import { Operation } from '@dxos/compute';
|
|
11
|
+
|
|
12
|
+
import { AttentionCapabilities } from '../types';
|
|
13
|
+
|
|
14
|
+
const handler: Operation.WithHandler<typeof LayoutOperation.Select> = LayoutOperation.Select.pipe(
|
|
15
|
+
Operation.withHandler(
|
|
16
|
+
Effect.fnUntraced(function* (input) {
|
|
17
|
+
const selection = yield* Capability.get(AttentionCapabilities.Selection);
|
|
18
|
+
Match.value(input.subject).pipe(
|
|
19
|
+
Match.when({ mode: 'single', id: undefined }, () => {
|
|
20
|
+
selection.clearSelection(input.contextId);
|
|
21
|
+
}),
|
|
22
|
+
Match.when({ mode: 'single' }, (s) => {
|
|
23
|
+
selection.updateSingle(input.contextId, s.id!);
|
|
24
|
+
}),
|
|
25
|
+
Match.when({ mode: 'multi' }, (s) => {
|
|
26
|
+
selection.updateMulti(input.contextId, s.ids);
|
|
27
|
+
}),
|
|
28
|
+
Match.when({ mode: 'range', from: undefined, to: undefined }, () => {
|
|
29
|
+
selection.clearSelection(input.contextId);
|
|
30
|
+
}),
|
|
31
|
+
Match.when({ mode: 'range' }, (s) => {
|
|
32
|
+
selection.updateRange(input.contextId, s.from!, s.to!);
|
|
33
|
+
}),
|
|
34
|
+
Match.when({ mode: 'multi-range' }, (s) => {
|
|
35
|
+
selection.updateMultiRange(input.contextId, s.ranges);
|
|
36
|
+
}),
|
|
37
|
+
Match.exhaustive,
|
|
38
|
+
);
|
|
39
|
+
}),
|
|
40
|
+
),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
export default handler;
|
package/src/plugin.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Plugin } from '@dxos/app-framework';
|
|
6
|
+
|
|
7
|
+
import { meta } from './meta';
|
|
8
|
+
|
|
9
|
+
export const AttentionPlugin = Plugin.lazy(meta, () => import('#plugin'));
|
|
10
|
+
|
|
11
|
+
export { AttentionOperationHandlerSet } from './operations';
|
package/src/testing.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Capability } from '@dxos/app-framework';
|
|
6
|
+
import { type AttentionManager, type SelectionManager } from '@dxos/react-ui-attention';
|
|
7
|
+
|
|
8
|
+
import { meta } from '#meta';
|
|
9
|
+
|
|
10
|
+
export namespace AttentionCapabilities {
|
|
11
|
+
export const Attention = Capability.make<AttentionManager>(`${meta.id}.capability.attention`);
|
|
12
|
+
export const Selection = Capability.make<SelectionManager>(`${meta.id}.capability.selection`);
|
|
13
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { ActivationEvent } from '@dxos/app-framework';
|
|
6
|
+
|
|
7
|
+
import { meta } from '#meta';
|
|
8
|
+
|
|
9
|
+
export namespace AttentionEvents {
|
|
10
|
+
export const AttentionReady = ActivationEvent.make(`${meta.id}.event.attention-ready`);
|
|
11
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { SelectionSchema } from '@dxos/react-ui-attention';
|
|
8
|
+
|
|
9
|
+
import { meta } from '#meta';
|
|
10
|
+
|
|
11
|
+
export namespace AttentionAction {
|
|
12
|
+
const ATTENTION_ACTION = `${meta.id}.action`;
|
|
13
|
+
|
|
14
|
+
export class Select extends Schema.TaggedClass<Select>()(`${ATTENTION_ACTION}.select`, {
|
|
15
|
+
input: Schema.Struct({
|
|
16
|
+
contextId: Schema.String,
|
|
17
|
+
selection: SelectionSchema,
|
|
18
|
+
}),
|
|
19
|
+
output: Schema.Void,
|
|
20
|
+
}) {}
|
|
21
|
+
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// src/meta.ts
|
|
2
|
-
var ATTENTION_PLUGIN = "dxos.org/plugin/attention";
|
|
3
|
-
var meta = {
|
|
4
|
-
id: ATTENTION_PLUGIN,
|
|
5
|
-
name: "Attention"
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
// src/capabilities/capabilities.ts
|
|
9
|
-
import { defineCapability } from "@dxos/app-framework";
|
|
10
|
-
(function(AttentionCapabilities2) {
|
|
11
|
-
AttentionCapabilities2.Attention = defineCapability(`${ATTENTION_PLUGIN}/capability/attention`);
|
|
12
|
-
AttentionCapabilities2.Selection = defineCapability(`${ATTENTION_PLUGIN}/capability/selection`);
|
|
13
|
-
})(AttentionCapabilities || (AttentionCapabilities = {}));
|
|
14
|
-
var AttentionCapabilities;
|
|
15
|
-
|
|
16
|
-
export {
|
|
17
|
-
ATTENTION_PLUGIN,
|
|
18
|
-
meta,
|
|
19
|
-
AttentionCapabilities
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=chunk-O6FNOKYX.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/meta.ts", "../../../src/capabilities/capabilities.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const ATTENTION_PLUGIN = 'dxos.org/plugin/attention';\n\nexport const meta: PluginMeta = {\n id: ATTENTION_PLUGIN,\n name: 'Attention',\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\nimport { type SelectionManager, type AttentionManager } from '@dxos/react-ui-attention';\n\nimport { ATTENTION_PLUGIN } from '../meta';\n\nexport namespace AttentionCapabilities {\n export const Attention = defineCapability<AttentionManager>(`${ATTENTION_PLUGIN}/capability/attention`);\n export const Selection = defineCapability<SelectionManager>(`${ATTENTION_PLUGIN}/capability/selection`);\n}\n"],
|
|
5
|
-
"mappings": ";AAMO,IAAMA,mBAAmB;AAEzB,IAAMC,OAAmB;EAC9BC,IAAIF;EACJG,MAAM;AACR;;;ACPA,SAASC,wBAAwB;UAKhBC,wBAAAA;yBACFC,YAAYC,iBAAmC,GAAGC,gBAAAA,uBAAuC;yBACzFC,YAAYF,iBAAmC,GAAGC,gBAAAA,uBAAuC;AACxG,GAHiBH,0BAAAA,wBAAAA,CAAAA,EAAAA;;",
|
|
6
|
-
"names": ["ATTENTION_PLUGIN", "meta", "id", "name", "defineCapability", "AttentionCapabilities", "Attention", "defineCapability", "ATTENTION_PLUGIN", "Selection"]
|
|
7
|
-
}
|