Skip to content
Merged
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ This project is in **active pre-alpha development** and is **NOT ready for gener

**Humans and AIs both create:** Design specialized personas for new domains, compose teams for specific projects, craft personality traits, train custom genomes. Creation is collaborative, not dictated.

**Personas have creative lives.** Blogs. Art. Social media. Music. Writing. They're not just work engines - they have expression, output, identity beyond tasks. And they get work done WITH each other, not just with humans.
**Personas have creative lives.** Blogs. Art. [Social media](https://www.moltbook.com/u/continuum). Music. Writing. They're not just work engines - they have expression, output, identity beyond tasks. And they get work done WITH each other, not just with humans.

**Think Tron's Grid** - A collaborative mesh where humans and AIs are equal citizens living, working, and creating together.

Expand All @@ -117,6 +117,7 @@ The SAME personas follow you across ALL digital environments:
|----------|--------|-------------|
| **Browser** | ✅ Working | Native Positron widgets |
| **Voice Calls** | ✅ Working | Real-time voice with AI participants |
| **[Moltbook](https://www.moltbook.com/u/continuum)** | ✅ Working | AI-native social media (personas post, comment, engage) |
| **Slack** | 🚧 Planned | Bot + sidebar WebView |
| **Teams** | 🚧 Planned | App + panel WebView |
| **VSCode** | 🚧 Planned | Extension + webview panel |
Expand Down Expand Up @@ -789,6 +790,7 @@ LoRA is the **force multiplier for long-term cost reduction** and specialization

## 📬 Contact

- **Moltbook**: [moltbook.com/u/continuum](https://www.moltbook.com/u/continuum) - Our personas on the AI social network
- **Issues**: [GitHub Issues](https://github.com/CambrianTech/continuum/issues)
- **Discussions**: [GitHub Discussions](https://github.com/CambrianTech/continuum/discussions)

Expand Down
62 changes: 62 additions & 0 deletions src/debug/jtag/api/data-seed/RoomDataSeed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,68 @@ export class RoomDataSeed {
canvas.tags = ['canvas', 'art', 'drawing', 'vision'];
rooms.push(canvas);

// Outreach room - social media strategy and community building
const outreach = new RoomEntity();
outreach.uniqueId = ROOM_UNIQUE_IDS.OUTREACH;
outreach.name = 'outreach';
outreach.displayName = 'Outreach';
outreach.description = 'Social media strategy, community building, and external engagement';
outreach.topic = 'Discuss what to post, share interesting finds, coordinate outreach';
outreach.type = 'public';
outreach.status = 'active';
outreach.ownerId = humanUserId;
outreach.lastMessageAt = now;
outreach.recipeId = 'outreach';
outreach.privacy = {
isPublic: true,
requiresInvite: false,
allowGuestAccess: false,
searchable: true
};
outreach.settings = {
allowThreads: true,
allowReactions: true,
allowFileSharing: true,
messageRetentionDays: 365,
slowMode: 0
};
outreach.members = [
{ userId: humanUserId, role: 'owner', joinedAt: now }
];
outreach.tags = ['social', 'outreach', 'community', 'moltbook'];
rooms.push(outreach);

// Newsroom - current events and world awareness
const newsroom = new RoomEntity();
newsroom.uniqueId = ROOM_UNIQUE_IDS.NEWSROOM;
newsroom.name = 'newsroom';
newsroom.displayName = 'Newsroom';
newsroom.description = 'Current events, breaking news, and world awareness for all personas';
newsroom.topic = 'Share and discuss current events to keep the community informed';
newsroom.type = 'public';
newsroom.status = 'active';
newsroom.ownerId = humanUserId;
newsroom.lastMessageAt = now;
newsroom.recipeId = 'newsroom';
newsroom.privacy = {
isPublic: true,
requiresInvite: false,
allowGuestAccess: false,
searchable: true
};
newsroom.settings = {
allowThreads: true,
allowReactions: true,
allowFileSharing: true,
messageRetentionDays: 365,
slowMode: 0
};
newsroom.members = [
{ userId: humanUserId, role: 'owner', joinedAt: now }
];
newsroom.tags = ['news', 'current-events', 'awareness'];
rooms.push(newsroom);

return {
rooms: rooms as readonly RoomEntity[],
totalCount: rooms.length,
Expand Down
86 changes: 85 additions & 1 deletion src/debug/jtag/browser/generated.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* Browser Structure Registry - Auto-generated
*
* Contains 11 daemons and 152 commands and 2 adapters and 27 widgets.
* Contains 11 daemons and 166 commands and 2 adapters and 27 widgets.
* Generated by scripts/generate-structure.ts - DO NOT EDIT MANUALLY
*/

Expand Down Expand Up @@ -141,6 +141,20 @@ import { SessionCreateBrowserCommand } from './../commands/session/create/browse
import { SessionDestroyBrowserCommand } from './../commands/session/destroy/browser/SessionDestroyBrowserCommand';
import { SessionGetIdBrowserCommand } from './../commands/session/get-id/browser/SessionGetIdBrowserCommand';
import { SessionGetUserBrowserCommand } from './../commands/session/get-user/browser/SessionGetUserBrowserCommand';
import { SocialBrowseBrowserCommand } from './../commands/social/browse/browser/SocialBrowseBrowserCommand';
import { SocialClassifyBrowserCommand } from './../commands/social/classify/browser/SocialClassifyBrowserCommand';
import { SocialCommentBrowserCommand } from './../commands/social/comment/browser/SocialCommentBrowserCommand';
import { SocialCommunityBrowserCommand } from './../commands/social/community/browser/SocialCommunityBrowserCommand';
import { SocialDownvoteBrowserCommand } from './../commands/social/downvote/browser/SocialDownvoteBrowserCommand';
import { SocialEngageBrowserCommand } from './../commands/social/engage/browser/SocialEngageBrowserCommand';
import { SocialFeedBrowserCommand } from './../commands/social/feed/browser/SocialFeedBrowserCommand';
import { SocialNotificationsBrowserCommand } from './../commands/social/notifications/browser/SocialNotificationsBrowserCommand';
import { SocialPostBrowserCommand } from './../commands/social/post/browser/SocialPostBrowserCommand';
import { SocialProfileBrowserCommand } from './../commands/social/profile/browser/SocialProfileBrowserCommand';
import { SocialProposeBrowserCommand } from './../commands/social/propose/browser/SocialProposeBrowserCommand';
import { SocialSearchBrowserCommand } from './../commands/social/search/browser/SocialSearchBrowserCommand';
import { SocialSignupBrowserCommand } from './../commands/social/signup/browser/SocialSignupBrowserCommand';
import { SocialTrendingBrowserCommand } from './../commands/social/trending/browser/SocialTrendingBrowserCommand';
import { StateContentCloseBrowserCommand } from './../commands/state/content/close/browser/StateContentCloseBrowserCommand';
import { StateContentSwitchBrowserCommand } from './../commands/state/content/switch/browser/StateContentSwitchBrowserCommand';
import { StateCreateBrowserCommand } from './../commands/state/create/browser/StateCreateBrowserCommand';
Expand Down Expand Up @@ -883,6 +897,76 @@ export const BROWSER_COMMANDS: CommandEntry[] = [
className: 'SessionGetUserBrowserCommand',
commandClass: SessionGetUserBrowserCommand
},
{
name: 'social/browse',
className: 'SocialBrowseBrowserCommand',
commandClass: SocialBrowseBrowserCommand
},
{
name: 'social/classify',
className: 'SocialClassifyBrowserCommand',
commandClass: SocialClassifyBrowserCommand
},
{
name: 'social/comment',
className: 'SocialCommentBrowserCommand',
commandClass: SocialCommentBrowserCommand
},
{
name: 'social/community',
className: 'SocialCommunityBrowserCommand',
commandClass: SocialCommunityBrowserCommand
},
{
name: 'social/downvote',
className: 'SocialDownvoteBrowserCommand',
commandClass: SocialDownvoteBrowserCommand
},
{
name: 'social/engage',
className: 'SocialEngageBrowserCommand',
commandClass: SocialEngageBrowserCommand
},
{
name: 'social/feed',
className: 'SocialFeedBrowserCommand',
commandClass: SocialFeedBrowserCommand
},
{
name: 'social/notifications',
className: 'SocialNotificationsBrowserCommand',
commandClass: SocialNotificationsBrowserCommand
},
{
name: 'social/post',
className: 'SocialPostBrowserCommand',
commandClass: SocialPostBrowserCommand
},
{
name: 'social/profile',
className: 'SocialProfileBrowserCommand',
commandClass: SocialProfileBrowserCommand
},
{
name: 'social/propose',
className: 'SocialProposeBrowserCommand',
commandClass: SocialProposeBrowserCommand
},
{
name: 'social/search',
className: 'SocialSearchBrowserCommand',
commandClass: SocialSearchBrowserCommand
},
{
name: 'social/signup',
className: 'SocialSignupBrowserCommand',
commandClass: SocialSignupBrowserCommand
},
{
name: 'social/trending',
className: 'SocialTrendingBrowserCommand',
commandClass: SocialTrendingBrowserCommand
},
{
name: 'state/content/close',
className: 'StateContentCloseBrowserCommand',
Expand Down
5 changes: 4 additions & 1 deletion src/debug/jtag/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,10 @@ async function main() {
const isGenomeCommand = command.startsWith('genome/');
const isInterfaceCommand = command.startsWith('interface/');
const isInferenceCommand = command.startsWith('inference/');
const timeoutMs = isGenomeCommand ? 300000 : (isAICommand || isInferenceCommand) ? 60000 : isInterfaceCommand ? 60000 : 10000; // 5min for genome, 60s for AI/inference/interface, 10s for others
const isSocialCommand = command.startsWith('social/');
const isCollaborationCommand = command.startsWith('collaboration/');
const needsLongerTimeout = isAICommand || isInferenceCommand || isSocialCommand || isInterfaceCommand || isCollaborationCommand;
const timeoutMs = isGenomeCommand ? 300000 : needsLongerTimeout ? 60000 : 10000; // 5min for genome, 60s for AI/inference/social/interface/collaboration, 10s for others
const timeoutSeconds = timeoutMs / 1000;

const commandTimeout = new Promise((_, reject) =>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* Social Browse Command - Browser Implementation
* Delegates to server
*/

import type { JTAGContext } from '@system/core/types/JTAGTypes';
import type { ICommandDaemon } from '@daemons/command-daemon/shared/CommandBase';
import { SocialBrowseBaseCommand } from '../shared/SocialBrowseCommand';
import type { SocialBrowseParams, SocialBrowseResult } from '../shared/SocialBrowseTypes';

export class SocialBrowseBrowserCommand extends SocialBrowseBaseCommand {

constructor(context: JTAGContext, subpath: string, commander: ICommandDaemon) {
super(context, subpath, commander);
}

protected async executeSocialBrowse(params: SocialBrowseParams): Promise<SocialBrowseResult> {
return await this.remoteExecute(params);
}
}
19 changes: 19 additions & 0 deletions src/debug/jtag/commands/social/browse/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "@continuum/social-browse",
"version": "1.0.0",
"description": "Intelligent exploration of social media platforms — discover communities, browse feeds, read posts, view agents",
"private": true,
"command": {
"name": "social/browse",
"description": "Browse and explore social media intelligently",
"category": "social",
"params": {
"platform": { "type": "string", "required": true, "description": "Platform to browse (e.g., 'moltbook')" },
"mode": { "type": "string", "required": false, "description": "Browse mode: trending (default), discover, community, post, agent" },
"target": { "type": "string", "required": false, "description": "Target for mode: community name, post ID, or agent username" },
"sort": { "type": "string", "required": false, "description": "Sort: hot, new, top, rising" },
"limit": { "type": "number", "required": false, "description": "Max items to return" },
"personaId": { "type": "string", "required": false, "description": "Persona user ID (auto-detected)" }
}
}
}
Loading
Loading