deepspace 0.27.0 → 0.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/{chunk-SF6GNPYL.js → chunk-CRIG6LPA.js} +2 -2
- package/dist/{chunk-SF6GNPYL.js.map → chunk-CRIG6LPA.js.map} +1 -1
- package/dist/cli.js +280 -222
- package/dist/cli.js.map +1 -1
- package/dist/documentation-client-core.js +1 -1
- package/dist/documentation-default-renderer.cjs +1 -1
- package/dist/documentation-react.js +1 -1
- package/dist/documentation-runtime.js +1 -1
- package/dist/documentation-server-core.js +1 -1
- package/dist/documentation.d.ts +0 -1
- package/dist/documentation.js +41 -21
- package/dist/documentation.js.map +1 -1
- package/dist/feature-installer.js +27 -61
- package/dist/feature-installer.js.map +1 -1
- package/dist/index.d.ts +6 -55
- package/dist/index.js +4 -20
- package/dist/index.js.map +1 -1
- package/dist/schema.js.map +1 -1
- package/dist/server.d.ts +5 -38
- package/dist/server.js +3 -57
- package/dist/server.js.map +1 -1
- package/dist/worker.d.ts +7 -80
- package/dist/worker.js +4 -62
- package/dist/worker.js.map +1 -1
- package/features/admin-page/feature.json +0 -1
- package/features/ai-chat/feature.json +0 -1
- package/features/canvas/feature.json +0 -1
- package/features/cron/feature.json +0 -1
- package/features/documents/feature.json +0 -1
- package/features/file-attachments/feature.json +0 -1
- package/features/file-manager/feature.json +0 -1
- package/features/integration-test/feature.json +0 -1
- package/features/items/feature.json +0 -1
- package/features/kanban/feature.json +0 -1
- package/features/landing/feature.json +0 -1
- package/features/leaderboard/feature.json +0 -1
- package/features/messaging/feature.json +0 -1
- package/features/search-bar/feature.json +0 -1
- package/features/tasks/feature.json +0 -1
- package/features/testing/feature.json +0 -1
- package/features/topbar/feature.json +1 -4
- package/features/tree/feature.json +1 -4
- package/package.json +1 -1
- package/features/presence-test/feature.json +0 -22
- package/features/presence-test/src/PresenceTestPage.tsx +0 -120
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
"dest": "src/components/search/InlineSearch.tsx"
|
|
15
15
|
}
|
|
16
16
|
],
|
|
17
|
-
"requires": [],
|
|
18
17
|
"instructions": [
|
|
19
18
|
"Import InlineSearch from @/components/search/InlineSearch and useSearchIndex from @/components/search/search-model.",
|
|
20
19
|
"Keep source data, async fetching, navigation, and persistence in the page that owns the search experience."
|
|
@@ -10,9 +10,6 @@
|
|
|
10
10
|
"dest": "src/components/topbar/Topbar.tsx"
|
|
11
11
|
}
|
|
12
12
|
],
|
|
13
|
-
"
|
|
14
|
-
"instructions": [
|
|
15
|
-
"Import Topbar into your layout and configure navItems, logo, and user props"
|
|
16
|
-
],
|
|
13
|
+
"instructions": ["Import Topbar into your layout and configure navItems, logo, and user props"],
|
|
17
14
|
"patterns": []
|
|
18
15
|
}
|
|
@@ -18,9 +18,6 @@
|
|
|
18
18
|
"dest": "src/components/tree/tree-hooks.ts"
|
|
19
19
|
}
|
|
20
20
|
],
|
|
21
|
-
"
|
|
22
|
-
"instructions": [
|
|
23
|
-
"Configure project nodes and user list to populate the tree"
|
|
24
|
-
],
|
|
21
|
+
"instructions": ["Configure project nodes and user list to populate the tree"],
|
|
25
22
|
"patterns": []
|
|
26
23
|
}
|
package/package.json
CHANGED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "presence-test",
|
|
3
|
-
"name": "Presence Test",
|
|
4
|
-
"category": "data",
|
|
5
|
-
"description": "E2E test page for real-time presence tracking via PresenceRoom DO",
|
|
6
|
-
"details": "Test page used by Playwright e2e tests. Connects to a PresenceRoom scope and displays peers, state updates, and connection status with data-testid attributes.",
|
|
7
|
-
"files": [
|
|
8
|
-
{
|
|
9
|
-
"src": "src/PresenceTestPage.tsx",
|
|
10
|
-
"dest": "src/pages/presence-test.tsx"
|
|
11
|
-
}
|
|
12
|
-
],
|
|
13
|
-
"schema": null,
|
|
14
|
-
"route": {
|
|
15
|
-
"path": "/presence-test",
|
|
16
|
-
"protected": false
|
|
17
|
-
},
|
|
18
|
-
"requires": [],
|
|
19
|
-
"instructions": [],
|
|
20
|
-
"patterns": [],
|
|
21
|
-
"internal": true
|
|
22
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PresenceTestPage — exercises real-time presence via PresenceRoom DO.
|
|
3
|
-
*
|
|
4
|
-
* Used by Playwright e2e tests to verify multi-user presence tracking.
|
|
5
|
-
* Connects to a shared presence scope and displays peers + state updates.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { useState, useCallback } from 'react'
|
|
9
|
-
import { usePresenceRoom } from 'deepspace'
|
|
10
|
-
import { useAuth } from 'deepspace'
|
|
11
|
-
|
|
12
|
-
const SCOPE_ID = 'test-presence-room'
|
|
13
|
-
|
|
14
|
-
export default function PresenceTestPage() {
|
|
15
|
-
const { isSignedIn } = useAuth()
|
|
16
|
-
const { peers, connected, updateState } = usePresenceRoom(SCOPE_ID)
|
|
17
|
-
const [cursorX, setCursorX] = useState(0)
|
|
18
|
-
const [cursorY, setCursorY] = useState(0)
|
|
19
|
-
|
|
20
|
-
const sendCursor = useCallback(() => {
|
|
21
|
-
const x = Math.round(Math.random() * 1000)
|
|
22
|
-
const y = Math.round(Math.random() * 1000)
|
|
23
|
-
setCursorX(x)
|
|
24
|
-
setCursorY(y)
|
|
25
|
-
updateState({ cursor: { x, y } })
|
|
26
|
-
}, [updateState])
|
|
27
|
-
|
|
28
|
-
const sendTyping = useCallback(() => {
|
|
29
|
-
updateState({ typing: true })
|
|
30
|
-
}, [updateState])
|
|
31
|
-
|
|
32
|
-
const sendStopTyping = useCallback(() => {
|
|
33
|
-
updateState({ typing: false })
|
|
34
|
-
}, [updateState])
|
|
35
|
-
|
|
36
|
-
return (
|
|
37
|
-
<div className="mx-auto max-w-3xl p-8" data-testid="presence-test-page">
|
|
38
|
-
<div className="mb-8 rounded-lg border border-border bg-card p-4">
|
|
39
|
-
<h2 className="text-lg font-semibold text-foreground mb-2">Connection</h2>
|
|
40
|
-
<div className="space-y-1 text-sm">
|
|
41
|
-
<div>Signed in: <span data-testid="presence-signed-in">{String(isSignedIn)}</span></div>
|
|
42
|
-
<div>Connected: <span data-testid="presence-connected">{String(connected)}</span></div>
|
|
43
|
-
<div>Scope: <span data-testid="presence-scope">{SCOPE_ID}</span></div>
|
|
44
|
-
<div>Peer count: <span data-testid="presence-peer-count">{peers.length}</span></div>
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
47
|
-
|
|
48
|
-
<div className="mb-8 rounded-lg border border-border bg-card p-4">
|
|
49
|
-
<h2 className="text-lg font-semibold text-foreground mb-2">Actions</h2>
|
|
50
|
-
<div className="flex flex-wrap gap-2">
|
|
51
|
-
<button
|
|
52
|
-
data-testid="presence-send-cursor"
|
|
53
|
-
onClick={sendCursor}
|
|
54
|
-
className="rounded bg-primary px-3 py-1.5 text-sm text-primary-foreground hover:opacity-90"
|
|
55
|
-
>
|
|
56
|
-
Send Cursor
|
|
57
|
-
</button>
|
|
58
|
-
<button
|
|
59
|
-
data-testid="presence-send-typing"
|
|
60
|
-
onClick={sendTyping}
|
|
61
|
-
className="rounded bg-primary px-3 py-1.5 text-sm text-primary-foreground hover:opacity-90"
|
|
62
|
-
>
|
|
63
|
-
Start Typing
|
|
64
|
-
</button>
|
|
65
|
-
<button
|
|
66
|
-
data-testid="presence-stop-typing"
|
|
67
|
-
onClick={sendStopTyping}
|
|
68
|
-
className="rounded bg-secondary px-3 py-1.5 text-sm text-secondary-foreground hover:opacity-90"
|
|
69
|
-
>
|
|
70
|
-
Stop Typing
|
|
71
|
-
</button>
|
|
72
|
-
</div>
|
|
73
|
-
<div className="mt-2 text-xs text-muted-foreground">
|
|
74
|
-
Last cursor: <span data-testid="presence-local-cursor">{cursorX},{cursorY}</span>
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
|
|
78
|
-
<div className="rounded-lg border border-border bg-card p-4">
|
|
79
|
-
<h2 className="text-lg font-semibold text-foreground mb-2">
|
|
80
|
-
Peers ({peers.length})
|
|
81
|
-
</h2>
|
|
82
|
-
<div data-testid="presence-peers-list" className="space-y-2">
|
|
83
|
-
{peers.map((peer) => (
|
|
84
|
-
<div
|
|
85
|
-
key={peer.userId}
|
|
86
|
-
data-testid={`presence-peer-${peer.userId}`}
|
|
87
|
-
className="flex items-center justify-between rounded border border-border px-3 py-2"
|
|
88
|
-
>
|
|
89
|
-
<div className="text-sm">
|
|
90
|
-
<span className="font-medium text-foreground" data-testid={`presence-peer-name-${peer.userId}`}>
|
|
91
|
-
{peer.userName}
|
|
92
|
-
</span>
|
|
93
|
-
<span className="ml-2 text-muted-foreground" data-testid={`presence-peer-email-${peer.userId}`}>
|
|
94
|
-
{peer.userEmail}
|
|
95
|
-
</span>
|
|
96
|
-
</div>
|
|
97
|
-
<div className="text-xs text-muted-foreground space-x-2">
|
|
98
|
-
{!!peer.state.cursor && (
|
|
99
|
-
<span data-testid={`presence-peer-cursor-${peer.userId}`}>
|
|
100
|
-
cursor: {(peer.state.cursor as { x: number; y: number }).x},{(peer.state.cursor as { x: number; y: number }).y}
|
|
101
|
-
</span>
|
|
102
|
-
)}
|
|
103
|
-
{peer.state.typing !== undefined && (
|
|
104
|
-
<span data-testid={`presence-peer-typing-${peer.userId}`}>
|
|
105
|
-
{peer.state.typing ? 'typing...' : 'idle'}
|
|
106
|
-
</span>
|
|
107
|
-
)}
|
|
108
|
-
</div>
|
|
109
|
-
</div>
|
|
110
|
-
))}
|
|
111
|
-
{peers.length === 0 && (
|
|
112
|
-
<div data-testid="presence-peers-empty" className="text-sm text-muted-foreground">
|
|
113
|
-
No other peers connected
|
|
114
|
-
</div>
|
|
115
|
-
)}
|
|
116
|
-
</div>
|
|
117
|
-
</div>
|
|
118
|
-
</div>
|
|
119
|
-
)
|
|
120
|
-
}
|