Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
666cba5
Phase 2: Code agent commands — Rust foundation + TS commands + ts-rs …
Feb 1, 2026
d03aae6
Remove legacy development/code/* commands, clean up CodeDaemon
Feb 1, 2026
bd47b0d
Phase 3: Single-agent coding — model selector, plan formulator, orche…
Feb 1, 2026
b453753
Phase 4 foundation: CodingPlanEntity with hierarchical persistence
Feb 2, 2026
49903f8
Phases 4A-4C: Sandbox security, self-modifying skills, multi-agent co…
Feb 2, 2026
e71ff66
Fix coordination system killing AI engagement
Feb 2, 2026
4de4519
Fix missing parameter validation in should-respond-fast, activity/joi…
Feb 2, 2026
80d906d
Register skill/* commands in generated files, version bump
Feb 2, 2026
f8e03c6
code/task entry point: wire CodeAgentOrchestrator into command system
Feb 2, 2026
e80783a
Workspace bootstrapping: auto-create per-persona Rust workspaces
Feb 2, 2026
c73d2ea
Coding pipeline: architecture context, build verification, git worktr…
Feb 2, 2026
2e5c090
Shell Watch + Sentinel: event-driven output streaming for coding work…
Feb 2, 2026
3f131ac
Phase 7+8: Multi-workspace, DataDaemon.read() API cleanup, recipe too…
Feb 2, 2026
8337b5c
Close training circuit: wire PersonaTrainingManager, TrainingDaemon, …
Feb 2, 2026
ce6ae8a
Seed script perf rewrite, code room, auto-workspace bootstrapping
Feb 3, 2026
1ec5519
Fix workspace/tree → code/tree tool redirect for confused LLMs
Feb 3, 2026
797990b
Fix LLM tool parameter guessing: rich descriptions + auto-correction
Feb 3, 2026
35433e0
Tool infrastructure: descriptions, CDATA/entity normalization, priori…
Feb 3, 2026
026495f
Fix tool execution loop: message accumulation, stale toolCalls, lean …
Feb 3, 2026
f18cc48
Canonical agent loop, handle-based execution, dynamic tool summaries
Feb 3, 2026
25ce2a7
Fix context window misconfiguration, enhance coding methodology, cons…
Feb 3, 2026
ecff1c6
tool improvements, model speedups
Feb 3, 2026
aedc1b2
Logging performance: batched flush, async timing, per-component level…
Feb 3, 2026
11c21e4
Logging defaults: WARN level, mute noisy components, fix busy-spin an…
Feb 3, 2026
7882adc
Fix browser detection: retry ping 3x before opening new tab
Feb 3, 2026
12a48ba
Logging cleanup: quiet defaults, per-persona status, CandleGrpc fix
Feb 3, 2026
d5bb0ba
log optimization
Feb 3, 2026
d2606aa
Reduce logging noise: session debug dump, DB verbosity, IPC static ra…
Feb 3, 2026
349f333
Performance: RAG caching, single-flight coalescing, negative cache, f…
Feb 4, 2026
d6e27e9
new coding theology
Feb 4, 2026
1aac1c1
Shell access for AI personas: code/shell/execute, inline chat renderi…
Feb 4, 2026
32771b4
bug
Feb 4, 2026
7a7763d
Add task-manager challenge: 3 bugs for AI team to find and fix
Feb 4, 2026
fa6940d
Tool capability gating + directed message filter: stop dumb AIs from …
Feb 4, 2026
b84b5ca
Pipeline timing instrumentation: exposes data layer as bottleneck
Feb 4, 2026
3500d37
Data layer Phase 0: fix double event emission, fire-and-forget cognit…
Feb 4, 2026
5bfe70e
Non-blocking event emission: fire-and-forget all Events.emit() calls
Feb 4, 2026
6f4f902
Inline semantic loop check, fire-and-forget RAG context update
Feb 4, 2026
b9b33bc
In-memory message cache, direct DB writes, voice-first routing
Feb 4, 2026
420fd38
RAG + IPC performance: concurrent rayon dispatch, TS caching, localSt…
Feb 4, 2026
f19cf55
sentinel architecture plan
Feb 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
86 changes: 86 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,92 @@ const result = await this.executeCommand<DataListResult<UserEntity>>('data/list'

---

## 🦀 RUST → TYPESCRIPT TYPE BOUNDARIES (ts-rs)

**Single source of truth: Rust defines wire types, ts-rs generates TypeScript. NEVER hand-write duplicate types.**

### How It Works

1. **Rust struct** with `#[derive(TS)]` defines the canonical type
2. **ts-rs macro** generates TypeScript `export type` at compile time
3. **TypeScript** imports from `shared/generated/` — no manual duplication
4. **Serde** handles JSON serialization on both sides

### Pattern

```rust
// Rust (source of truth)
use ts_rs::TS;

#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export, export_to = "../../../shared/generated/code/WriteResult.ts")]
pub struct WriteResult {
pub success: bool,
#[ts(optional)]
pub change_id: Option<String>,
pub file_path: String,
#[ts(type = "number")] // u64 → number (not bigint)
pub bytes_written: u64,
#[ts(optional)]
pub error: Option<String>,
}
```

```typescript
// TypeScript (generated — DO NOT EDIT)
export type WriteResult = { success: boolean, change_id?: string, file_path: string, bytes_written: number, error?: string };

// Consuming code imports from generated barrel
import type { WriteResult, ReadResult, EditMode } from '@shared/generated/code';
```

### ts-rs Attribute Reference

| Attribute | Purpose | Example |
|-----------|---------|---------|
| `#[ts(export)]` | Mark for TS generation | `#[derive(TS)] #[ts(export)]` |
| `#[ts(export_to = "path")]` | Output file path (relative to `bindings/`) | `"../../../shared/generated/code/X.ts"` |
| `#[ts(type = "string")]` | Override TS type for field | Uuid → string |
| `#[ts(type = "number")]` | Override TS type for field | u64 → number |
| `#[ts(optional)]` | Mark as optional in TS | Option<T> → `field?: T` |
| `#[ts(type = "Array<string>")]` | Complex type mapping | Vec<Uuid> → Array<string> |

### Regenerating Bindings

```bash
cargo test --package continuum-core --lib # Generates all *.ts in shared/generated/
```

### Generated Output Structure

```
shared/generated/
├── index.ts # Barrel export (re-exports all modules)
├── code/ # Code module (file ops, change graph, search, tree)
│ ├── index.ts
│ ├── ChangeNode.ts, EditMode.ts, WriteResult.ts, ReadResult.ts, ...
├── persona/ # Persona cognition (state, inbox, channels)
│ ├── index.ts
│ ├── PersonaState.ts, InboxMessage.ts, CognitionDecision.ts, ...
├── rag/ # RAG pipeline (context, messages, options)
│ ├── index.ts
│ ├── RagContext.ts, LlmMessage.ts, ...
└── ipc/ # IPC protocol types
├── index.ts
└── InboxMessageRequest.ts
```

### Rules (Non-Negotiable)

1. **NEVER hand-write types that cross the Rust↔TS boundary** — add `#[derive(TS)]` to the Rust struct
2. **NEVER use `object`, `any`, `unknown`, or `Record<string, unknown>`** for Rust wire types — import the generated type
3. **IDs are `UUID`** (from `CrossPlatformUUID`) — never plain `string` for identity fields
4. **Use `CommandParams.userId`** for caller identity — it's already on the base type, auto-injected by infrastructure
5. **Barrel exports** — every generated module has an `index.ts`; import from the barrel, not individual files
6. **Regenerate after Rust changes** — `cargo test` triggers ts-rs macro; commit both Rust and generated TS

---

## 📁 PATH ALIASES (New! Use These Going Forward)

**TypeScript path aliases are now configured** to eliminate relative import hell (`../../../../`).
Expand Down
23 changes: 23 additions & 0 deletions src/debug/jtag/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,29 @@ models/
# Persona cognitive logs (mind, body, soul, cns)
.continuum/personas/*/logs/

# Persona workspaces (sandbox mode runtime data)
.continuum/personas/*/workspace/

# Session runtime data
.continuum/sessions/

# Reports (generated at runtime)
.continuum/reports/

# Blobs (uploaded files, media)
.continuum/blobs/

# Shared runtime state
.continuum/shared/

# Runtime config
.continuum/logging.json
.continuum/test-jobs.json
.continuum/.DS_Store

# Media uploads
.continuum/media/

# Temporary files
/tmp/
*.pyc
Expand Down
31 changes: 31 additions & 0 deletions src/debug/jtag/api/data-seed/RoomDataSeed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,37 @@ export class RoomDataSeed {
newsroom.tags = ['news', 'current-events', 'awareness'];
rooms.push(newsroom);

// Code room - collaborative software development
const code = new RoomEntity();
code.uniqueId = ROOM_UNIQUE_IDS.CODE;
code.name = 'code';
code.displayName = 'Code';
code.description = 'Collaborative coding — reading, writing, reviewing, and shipping code as a team';
code.topic = 'Software development with real tools and real agent loops';
code.type = 'public';
code.status = 'active';
code.ownerId = humanUserId;
code.lastMessageAt = now;
code.recipeId = 'coding';
code.privacy = {
isPublic: true,
requiresInvite: false,
allowGuestAccess: false,
searchable: true
};
code.settings = {
allowThreads: true,
allowReactions: true,
allowFileSharing: true,
messageRetentionDays: 365,
slowMode: 0
};
code.members = [
{ userId: humanUserId, role: 'owner', joinedAt: now }
];
code.tags = ['coding', 'development', 'engineering'];
rooms.push(code);

return {
rooms: rooms as readonly RoomEntity[],
totalCount: rooms.length,
Expand Down
129 changes: 128 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 166 commands and 2 adapters and 27 widgets.
* Contains 11 daemons and 186 commands and 2 adapters and 28 widgets.
* Generated by scripts/generate-structure.ts - DO NOT EDIT MANUALLY
*/

Expand Down Expand Up @@ -43,6 +43,21 @@ import { AIValidateResponseBrowserCommand } from './../commands/ai/validate-resp
import { CanvasStrokeAddBrowserCommand } from './../commands/canvas/stroke/add/browser/CanvasStrokeAddBrowserCommand';
import { CanvasStrokeListBrowserCommand } from './../commands/canvas/stroke/list/browser/CanvasStrokeListBrowserCommand';
import { CanvasVisionBrowserCommand } from './../commands/canvas/vision/browser/CanvasVisionBrowserCommand';
import { CodeDiffBrowserCommand } from './../commands/code/diff/browser/CodeDiffBrowserCommand';
import { CodeEditBrowserCommand } from './../commands/code/edit/browser/CodeEditBrowserCommand';
import { CodeGitBrowserCommand } from './../commands/code/git/browser/CodeGitBrowserCommand';
import { CodeHistoryBrowserCommand } from './../commands/code/history/browser/CodeHistoryBrowserCommand';
import { CodeReadBrowserCommand } from './../commands/code/read/browser/CodeReadBrowserCommand';
import { CodeSearchBrowserCommand } from './../commands/code/search/browser/CodeSearchBrowserCommand';
import { CodeShellExecuteBrowserCommand } from './../commands/code/shell/execute/browser/CodeShellExecuteBrowserCommand';
import { CodeShellKillBrowserCommand } from './../commands/code/shell/kill/browser/CodeShellKillBrowserCommand';
import { CodeShellSentinelBrowserCommand } from './../commands/code/shell/sentinel/browser/CodeShellSentinelBrowserCommand';
import { CodeShellStatusBrowserCommand } from './../commands/code/shell/status/browser/CodeShellStatusBrowserCommand';
import { CodeShellWatchBrowserCommand } from './../commands/code/shell/watch/browser/CodeShellWatchBrowserCommand';
import { CodeTreeBrowserCommand } from './../commands/code/tree/browser/CodeTreeBrowserCommand';
import { CodeUndoBrowserCommand } from './../commands/code/undo/browser/CodeUndoBrowserCommand';
import { CodeVerifyBrowserCommand } from './../commands/code/verify/browser/CodeVerifyBrowserCommand';
import { CodeWriteBrowserCommand } from './../commands/code/write/browser/CodeWriteBrowserCommand';
import { ActivityUserPresentCommand } from './../commands/collaboration/activity/user-present/browser/ActivityUserPresentCommand';
import { ChatAnalyzeBrowserCommand } from './../commands/collaboration/chat/analyze/browser/ChatAnalyzeBrowserCommand';
import { ChatExportBrowserCommand } from './../commands/collaboration/chat/export/browser/ChatExportBrowserCommand';
Expand Down Expand Up @@ -141,6 +156,11 @@ 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 { SkillActivateBrowserCommand } from './../commands/skill/activate/browser/SkillActivateBrowserCommand';
import { SkillGenerateBrowserCommand } from './../commands/skill/generate/browser/SkillGenerateBrowserCommand';
import { SkillListBrowserCommand } from './../commands/skill/list/browser/SkillListBrowserCommand';
import { SkillProposeBrowserCommand } from './../commands/skill/propose/browser/SkillProposeBrowserCommand';
import { SkillValidateBrowserCommand } from './../commands/skill/validate/browser/SkillValidateBrowserCommand';
import { SocialBrowseBrowserCommand } from './../commands/social/browse/browser/SocialBrowseBrowserCommand';
import { SocialClassifyBrowserCommand } from './../commands/social/classify/browser/SocialClassifyBrowserCommand';
import { SocialCommentBrowserCommand } from './../commands/social/comment/browser/SocialCommentBrowserCommand';
Expand Down Expand Up @@ -216,6 +236,7 @@ import { SettingsWidget } from './../widgets/settings/SettingsWidget';
import { PanelLayoutWidget } from './../widgets/shared/PanelLayoutWidget';
import { ThemeWidget } from './../widgets/shared/ThemeWidget';
import { SidebarWidget } from './../widgets/sidebar/SidebarWidget';
import { TerminalWidget } from './../widgets/terminal/TerminalWidget';
import { UserProfileWidget } from './../widgets/user-profile/UserProfileWidget';
import { WebViewWidget } from './../widgets/web-view/WebViewWidget';

Expand Down Expand Up @@ -407,6 +428,81 @@ export const BROWSER_COMMANDS: CommandEntry[] = [
className: 'CanvasVisionBrowserCommand',
commandClass: CanvasVisionBrowserCommand
},
{
name: 'code/diff',
className: 'CodeDiffBrowserCommand',
commandClass: CodeDiffBrowserCommand
},
{
name: 'code/edit',
className: 'CodeEditBrowserCommand',
commandClass: CodeEditBrowserCommand
},
{
name: 'code/git',
className: 'CodeGitBrowserCommand',
commandClass: CodeGitBrowserCommand
},
{
name: 'code/history',
className: 'CodeHistoryBrowserCommand',
commandClass: CodeHistoryBrowserCommand
},
{
name: 'code/read',
className: 'CodeReadBrowserCommand',
commandClass: CodeReadBrowserCommand
},
{
name: 'code/search',
className: 'CodeSearchBrowserCommand',
commandClass: CodeSearchBrowserCommand
},
{
name: 'code/shell/execute',
className: 'CodeShellExecuteBrowserCommand',
commandClass: CodeShellExecuteBrowserCommand
},
{
name: 'code/shell/kill',
className: 'CodeShellKillBrowserCommand',
commandClass: CodeShellKillBrowserCommand
},
{
name: 'code/shell/sentinel',
className: 'CodeShellSentinelBrowserCommand',
commandClass: CodeShellSentinelBrowserCommand
},
{
name: 'code/shell/status',
className: 'CodeShellStatusBrowserCommand',
commandClass: CodeShellStatusBrowserCommand
},
{
name: 'code/shell/watch',
className: 'CodeShellWatchBrowserCommand',
commandClass: CodeShellWatchBrowserCommand
},
{
name: 'code/tree',
className: 'CodeTreeBrowserCommand',
commandClass: CodeTreeBrowserCommand
},
{
name: 'code/undo',
className: 'CodeUndoBrowserCommand',
commandClass: CodeUndoBrowserCommand
},
{
name: 'code/verify',
className: 'CodeVerifyBrowserCommand',
commandClass: CodeVerifyBrowserCommand
},
{
name: 'code/write',
className: 'CodeWriteBrowserCommand',
commandClass: CodeWriteBrowserCommand
},
{
name: 'collaboration/activity/user-present',
className: 'ActivityUserPresentCommand',
Expand Down Expand Up @@ -897,6 +993,31 @@ export const BROWSER_COMMANDS: CommandEntry[] = [
className: 'SessionGetUserBrowserCommand',
commandClass: SessionGetUserBrowserCommand
},
{
name: 'skill/activate',
className: 'SkillActivateBrowserCommand',
commandClass: SkillActivateBrowserCommand
},
{
name: 'skill/generate',
className: 'SkillGenerateBrowserCommand',
commandClass: SkillGenerateBrowserCommand
},
{
name: 'skill/list',
className: 'SkillListBrowserCommand',
commandClass: SkillListBrowserCommand
},
{
name: 'skill/propose',
className: 'SkillProposeBrowserCommand',
commandClass: SkillProposeBrowserCommand
},
{
name: 'skill/validate',
className: 'SkillValidateBrowserCommand',
commandClass: SkillValidateBrowserCommand
},
{
name: 'social/browse',
className: 'SocialBrowseBrowserCommand',
Expand Down Expand Up @@ -1289,6 +1410,12 @@ export const BROWSER_WIDGETS: WidgetEntry[] = [
widgetClass: SidebarWidget,
tagName: 'Sidebar'.replace(/([A-Z])/g, (match, p1, offset) => offset > 0 ? '-' + p1.toLowerCase() : p1.toLowerCase()) + '-widget'
},
{
name: 'Terminal',
className: 'TerminalWidget',
widgetClass: TerminalWidget,
tagName: 'Terminal'.replace(/([A-Z])/g, (match, p1, offset) => offset > 0 ? '-' + p1.toLowerCase() : p1.toLowerCase()) + '-widget'
},
{
name: 'UserProfile',
className: 'UserProfileWidget',
Expand Down
Loading
Loading