diff --git a/backlog/tasks/task-39 - Port-MycelialIntelligence-system-global-AI-bar-shape.md b/backlog/tasks/task-39 - Port-MycelialIntelligence-system-global-AI-bar-shape.md index e13010a..3477185 100644 --- a/backlog/tasks/task-39 - Port-MycelialIntelligence-system-global-AI-bar-shape.md +++ b/backlog/tasks/task-39 - Port-MycelialIntelligence-system-global-AI-bar-shape.md @@ -1,9 +1,10 @@ --- id: TASK-39 title: Port MycelialIntelligence system (global AI bar + shape) -status: To Do +status: Done assignee: [] created_date: '2026-02-18 19:51' +updated_date: '2026-02-28 00:29' labels: - shape-port - phase-5 @@ -42,9 +43,43 @@ The bar should be added as a persistent element in canvas.html, independent of t ## Acceptance Criteria - [ ] #1 AI bar renders as persistent bottom UI element -- [ ] #2 Chat prompt sends to LLM and displays responses -- [ ] #3 Bar is context-aware of selected shapes and canvas state -- [ ] #4 Can create/modify shapes via AI commands +- [x] #2 Chat prompt sends to LLM and displays responses +- [x] #3 Bar is context-aware of selected shapes and canvas state +- [x] #4 Can create/modify shapes via AI commands - [ ] #5 Backward-compat folk-mycelial-intelligence shape exists - [ ] #6 Toolbar button toggles bar visibility + +## Implementation Notes + + +Phase A partially complete via rstack-mi header bar (shared/components/rstack-mi.ts). Context-aware MI bar now gathers open shapes, active tab, page title and sends to /api/mi/ask. Present in header across all *.rspace.online pages. Commits: f8bd09d, 59f2be3. Remaining: Phase B-D (deeper canvas integration, shape creation via AI, full tool integration) still To Do. + +Phase B-D implemented (2026-02-27): + +**Phase B — Deep Canvas Context:** +- `lib/mi-canvas-bridge.ts`: Singleton collecting shapes, connections, viewport, shape groups from live canvas +- `website/canvas.html`: Wired bridge to selection (pointerdown), viewport (pan/zoom), deselection +- `rstack-mi.ts`: `#gatherContext()` reads bridge for selected shapes, connections, viewport, shape groups, type stats +- `server/index.ts`: System prompt includes selected shapes, connections, viewport zoom/pan, shape groups, type counts + +**Phase C — Shape Creation/Modification:** +- `lib/mi-actions.ts`: `[MI_ACTION:{...}]` parser + action types (create/update/delete/connect/move/transform/navigate) +- `lib/mi-action-executor.ts`: Executes actions against canvas via `window.__canvasApi` with `$N` backreferences +- `website/canvas.html`: Exposes `window.__canvasApi` (newShape, findFreePosition, SHAPE_DEFAULTS, sync) +- `rstack-mi.ts`: Parses actions from response, executes them, shows confirmation chips +- `server/index.ts`: Action/transform syntax documentation in system prompt + +**Phase D — Transforms + Tool Suggestions:** +- `lib/mi-selection-transforms.ts`: 15 transforms (align, distribute, arrange, match-size) on `window.__miSelectionTransforms` +- `lib/mi-tool-schema.ts`: 23 tool hints with keyword scoring, `suggestTools()` returns top 3 matches +- `rstack-mi.ts`: Tool suggestion chips below responses, clickable to create shapes + +All exported from `lib/index.ts`. Commits: d850a76, 0c00a69. + + +## Final Summary + + +MI Phases A-D complete. The MI bar is context-aware of the full canvas state (selection, connections, viewport, shape groups), can create/modify/delete/connect shapes via `[MI_ACTION:{...}]` protocol with $N backreferences, supports 15 selection transforms (align, distribute, arrange, match-size), and suggests relevant tools as clickable chips. 5 new lib files, 4 modified files, ~900 lines added. Deployed to production. + diff --git a/backlog/tasks/task-65 - Feed-aware-flow-wiring-CSS-3D-interactive-layer-view.md b/backlog/tasks/task-65 - Feed-aware-flow-wiring-CSS-3D-interactive-layer-view.md new file mode 100644 index 0000000..50a69a0 --- /dev/null +++ b/backlog/tasks/task-65 - Feed-aware-flow-wiring-CSS-3D-interactive-layer-view.md @@ -0,0 +1,92 @@ +--- +id: TASK-65 +title: Feed-aware flow wiring + CSS 3D interactive layer view +status: Done +assignee: + - '@claude' +created_date: '2026-02-27 22:46' +updated_date: '2026-02-28 00:29' +labels: + - feature + - canvas + - ux +milestone: rspace-app-ecosystem +dependencies: + - TASK-57 +references: + - shared/components/rstack-tab-bar.ts + - shared/module.ts + - lib/layer-types.ts +priority: high +--- + +## Description + + +Extend the layered tab system (TASK-57) with feed-aware flow wiring and a CSS 3D interactive layer view replacing the flat SVG stack view. + +## Feed-Aware Flow Wiring +- Extended TabBarModule interface with feeds/acceptsFeeds fields +- Added compatibility helpers: #getModuleOutputKinds, #getModuleInputKinds, #getCompatibleKinds, #getContainedFeeds +- Flow creation dialog now filters kind buttons by source/target feed compatibility +- Disabled incompatible kinds at 25% opacity with pointer-events none +- Feed count badges on compatible kinds +- Default selection = first compatible kind (not always "data") + +## CSS 3D Interactive Layer View +- Replaced SVG #renderStackView() with CSS perspective + preserve-3d scene +- Glassmorphism layer planes with backdrop-filter blur, module badge colors +- Feed port indicators (colored dots for in/out kinds on each layer) +- Containment indicators — lock icon on feeds with no outgoing flow +- Animated flow particles via CSS keyframes, count proportional to strength +- Orbit controls — mouse drag rotates scene (rotateX/rotateZ) +- Scroll zoom — adjusts perspective distance +- Time scrubber — play/pause button + speed slider (0.1x–5x) +- Click layer to switch, drag between layers to create flow, right-click particle to delete flow +- Responsive mobile sizing + +## FeedDefinition consolidation +- Fixed shared/module.ts to import FeedDefinition locally (was only re-exporting) + + +## Acceptance Criteria + +- [x] #1 Tab bar extended with feeds/acceptsFeeds on TabBarModule interface +- [x] #2 Flow dialog filters kind buttons by source feeds / target acceptsFeeds compatibility +- [x] #3 Disabled flow kinds shown at 25% opacity with pointer-events none +- [x] #4 Feed count badge shown on compatible flow kinds +- [x] #5 Default flow kind selection is first compatible (not always data) +- [x] #6 3D scene renders layers as translucent CSS planes with perspective +- [x] #7 Mouse drag on empty space orbits/rotates the 3D scene +- [x] #8 Scroll wheel zooms (adjusts perspective distance) +- [x] #9 Flow particles animate between layer planes with CSS keyframes +- [x] #10 Particle count proportional to flow strength, color matches FLOW_COLORS +- [x] #11 Time scrubber controls particle speed (0.1x–5x) with play/pause +- [x] #12 Contained feeds (no outgoing flow) show lock icon on layer plane +- [x] #13 Click layer to switch tab, drag between layers opens flow dialog +- [x] #14 Right-click flow particle to delete flow +- [x] #15 bunx tsc --noEmit passes with zero errors + + +## Implementation Notes + + +I/O chip upgrade (2026-02-27): Replaced 6px dot ports with labeled pluggable I/O chips on each layer plane. Output feeds shown as filled chips with feed names (e.g. "Treasury Flows"), input accepts shown as dashed-outline chips by flow kind (e.g. "Data", "Delegation"). Contained feeds dimmed with lock icon inline. Flow colors updated: green=economic (#4ade80), purple=delegation (#a78bfa), blue=data (#60a5fa). Governance label renamed to "Delegation". Commits: d850a76, 0c00a69. + + +## Final Summary + + +## Summary +Extended the layered tab system with feed-aware flow wiring and a CSS 3D interactive layer view. + +## Files Changed (2 files, +246/-14 lines) + +**Modified files:** +- `shared/components/rstack-tab-bar.ts` (+246 lines) — Extended TabBarModule with feeds/acceptsFeeds, 4 compatibility helper methods, feed-aware flow dialog with filtering/badges/smart defaults, replaced SVG stack view with CSS 3D perspective scene (glassmorphism layers, animated flow particles, orbit controls, scroll zoom, time scrubber, containment indicators, responsive mobile) +- `shared/module.ts` (+1/-1 line) — Import FeedDefinition locally alongside re-export + +## Commits +- `9e4648b` feat: feed-aware flow wiring + CSS 3D interactive layer view (dev) +- `2ef68e7` merge dev→main + diff --git a/backlog/tasks/task-69 - folk-rapp-auto-derives-space-context-subdomain-URL-canonicalization.md b/backlog/tasks/task-69 - folk-rapp-auto-derives-space-context-subdomain-URL-canonicalization.md new file mode 100644 index 0000000..02f17c4 --- /dev/null +++ b/backlog/tasks/task-69 - folk-rapp-auto-derives-space-context-subdomain-URL-canonicalization.md @@ -0,0 +1,41 @@ +--- +id: TASK-69 +title: folk-rapp auto-derives space context + subdomain URL canonicalization +status: Done +assignee: [] +created_date: '2026-02-28 00:29' +updated_date: '2026-02-28 00:29' +labels: + - fix + - routing + - canvas +dependencies: [] +priority: high +--- + +## Description + + +Two fixes ensuring rApps on canvas load as applets directly in the correct space: + +1. **folk-rapp race condition fix**: `createRenderRoot` unconditionally read `getAttribute("module-id")` which returned `""` and overwrote the `moduleId` already set via JS property setter — showing the picker menu instead of loading the module. Fixed to preserve JS-set properties. + +2. **Auto-derive spaceSlug**: folk-rapp now reads the current URL path (`/{space}/canvas` → space) to auto-derive spaceSlug so embedded rApps always know their space context without explicit passing. + +3. **Subdomain canonicalization**: `rspace.online/{space}/{moduleId}` now 301-redirects to `{space}.rspace.online/{moduleId}`. Spaces are subdomains, not path segments. + + +## Acceptance Criteria + +- [x] #1 folk-rapp shapes with moduleId set load the iframe directly without showing picker +- [x] #2 spaceSlug auto-derived from URL when not explicitly provided +- [x] #3 rspace.online/{space}/{moduleId} redirects 301 to {space}.rspace.online/{moduleId} +- [x] #4 newShapeElement passes communitySlug as fallback spaceSlug when restoring folk-rapp from sync +- [x] #5 bun run build passes with zero errors + + +## Final Summary + + +Fixed folk-rapp shapes to load as applets directly in the current space. Resolved race condition where createRenderRoot overwrote JS-set moduleId. Added auto-derivation of spaceSlug from URL. Added 301 redirect from path-based space URLs to subdomain form. Commits: 09d23f8, 9f3c9ab. Deployed to production. +