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.
Files changed (46) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/{chunk-SF6GNPYL.js → chunk-CRIG6LPA.js} +2 -2
  3. package/dist/{chunk-SF6GNPYL.js.map → chunk-CRIG6LPA.js.map} +1 -1
  4. package/dist/cli.js +280 -222
  5. package/dist/cli.js.map +1 -1
  6. package/dist/documentation-client-core.js +1 -1
  7. package/dist/documentation-default-renderer.cjs +1 -1
  8. package/dist/documentation-react.js +1 -1
  9. package/dist/documentation-runtime.js +1 -1
  10. package/dist/documentation-server-core.js +1 -1
  11. package/dist/documentation.d.ts +0 -1
  12. package/dist/documentation.js +41 -21
  13. package/dist/documentation.js.map +1 -1
  14. package/dist/feature-installer.js +27 -61
  15. package/dist/feature-installer.js.map +1 -1
  16. package/dist/index.d.ts +6 -55
  17. package/dist/index.js +4 -20
  18. package/dist/index.js.map +1 -1
  19. package/dist/schema.js.map +1 -1
  20. package/dist/server.d.ts +5 -38
  21. package/dist/server.js +3 -57
  22. package/dist/server.js.map +1 -1
  23. package/dist/worker.d.ts +7 -80
  24. package/dist/worker.js +4 -62
  25. package/dist/worker.js.map +1 -1
  26. package/features/admin-page/feature.json +0 -1
  27. package/features/ai-chat/feature.json +0 -1
  28. package/features/canvas/feature.json +0 -1
  29. package/features/cron/feature.json +0 -1
  30. package/features/documents/feature.json +0 -1
  31. package/features/file-attachments/feature.json +0 -1
  32. package/features/file-manager/feature.json +0 -1
  33. package/features/integration-test/feature.json +0 -1
  34. package/features/items/feature.json +0 -1
  35. package/features/kanban/feature.json +0 -1
  36. package/features/landing/feature.json +0 -1
  37. package/features/leaderboard/feature.json +0 -1
  38. package/features/messaging/feature.json +0 -1
  39. package/features/search-bar/feature.json +0 -1
  40. package/features/tasks/feature.json +0 -1
  41. package/features/testing/feature.json +0 -1
  42. package/features/topbar/feature.json +1 -4
  43. package/features/tree/feature.json +1 -4
  44. package/package.json +1 -1
  45. package/features/presence-test/feature.json +0 -22
  46. package/features/presence-test/src/PresenceTestPage.tsx +0 -120
@@ -24,7 +24,6 @@
24
24
  "protected": true,
25
25
  "roles": ["admin"]
26
26
  },
27
- "requires": [],
28
27
  "instructions": [],
29
28
  "patterns": []
30
29
  }
@@ -20,7 +20,6 @@
20
20
  "path": "/assistant",
21
21
  "protected": true
22
22
  },
23
- "requires": [],
24
23
  "dependencies": {
25
24
  "react-markdown": "^9.0.0",
26
25
  "remark-gfm": "^4.0.0",
@@ -39,7 +39,6 @@
39
39
  "path": "/canvas",
40
40
  "protected": true
41
41
  },
42
- "requires": [],
43
42
  "instructions": [],
44
43
  "patterns": []
45
44
  }
@@ -14,7 +14,6 @@
14
14
  "path": "/cron-log",
15
15
  "protected": false
16
16
  },
17
- "requires": [],
18
17
  "code": [
19
18
  {
20
19
  "file": "src/cron.ts",
@@ -67,7 +67,6 @@
67
67
  "path": "/documents",
68
68
  "protected": true
69
69
  },
70
- "requires": [],
71
70
  "dependencies": {
72
71
  "@tiptap/react": "^3.22.0",
73
72
  "@tiptap/pm": "^3.22.0",
@@ -20,7 +20,6 @@
20
20
  "path": "/attachments",
21
21
  "protected": true
22
22
  },
23
- "requires": [],
24
23
  "dependencies": {
25
24
  "file-type": "^19.6.0",
26
25
  "@uiw/react-codemirror": "^4.23.0",
@@ -14,7 +14,6 @@
14
14
  "path": "/file-manager",
15
15
  "protected": true
16
16
  },
17
- "requires": [],
18
17
  "instructions": [],
19
18
  "patterns": [
20
19
  "useR2Files() for upload, list, download, delete",
@@ -18,7 +18,6 @@
18
18
  "path": "/integration-test",
19
19
  "protected": false
20
20
  },
21
- "requires": [],
22
21
  "instructions": [],
23
22
  "patterns": [],
24
23
  "internal": true
@@ -23,7 +23,6 @@
23
23
  "path": "/items",
24
24
  "protected": true
25
25
  },
26
- "requires": [],
27
26
  "instructions": [],
28
27
  "patterns": []
29
28
  }
@@ -10,7 +10,6 @@
10
10
  "dest": "src/components/kanban/Kanban.tsx"
11
11
  }
12
12
  ],
13
- "requires": [],
14
13
  "instructions": [
15
14
  "Import KanbanBoard and useKanban from 'src/components/kanban/Kanban' (adjust the relative path to match where you use it)"
16
15
  ],
@@ -54,7 +54,6 @@
54
54
  "path": "/landing",
55
55
  "protected": false
56
56
  },
57
- "requires": [],
58
57
  "dependencies": {
59
58
  "framer-motion": "^12.38.0"
60
59
  },
@@ -23,7 +23,6 @@
23
23
  "path": "/leaderboard",
24
24
  "protected": true
25
25
  },
26
- "requires": [],
27
26
  "instructions": [],
28
27
  "patterns": []
29
28
  }
@@ -59,7 +59,6 @@
59
59
  "path": "/chat",
60
60
  "protected": true
61
61
  },
62
- "requires": [],
63
62
  "instructions": [
64
63
  "The included schemas and UI are for public channels. Add server-enforced tenant or participant scoping before implementing private groups or direct messages."
65
64
  ],
@@ -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."
@@ -27,7 +27,6 @@
27
27
  "path": "/tasks",
28
28
  "protected": true
29
29
  },
30
- "requires": [],
31
30
  "instructions": [],
32
31
  "patterns": []
33
32
  }
@@ -43,7 +43,6 @@
43
43
  "path": "/test",
44
44
  "protected": false
45
45
  },
46
- "requires": [],
47
46
  "instructions": [],
48
47
  "patterns": [],
49
48
  "internal": true
@@ -10,9 +10,6 @@
10
10
  "dest": "src/components/topbar/Topbar.tsx"
11
11
  }
12
12
  ],
13
- "requires": [],
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
- "requires": [],
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,6 +1,6 @@
1
1
  {
2
2
  "name": "deepspace",
3
- "version": "0.27.0",
3
+ "version": "0.27.1",
4
4
  "engines": {
5
5
  "node": ">=22.15.0 <23 || >=24 <25 || >=26 <27"
6
6
  },
@@ -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
- }