@aion0/forge 0.3.4 → 0.3.5

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.
@@ -0,0 +1,46 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+
5
+ export interface Tab {
6
+ id: number;
7
+ label: string;
8
+ }
9
+
10
+ export interface TabBarProps {
11
+ tabs: Tab[];
12
+ activeId: number;
13
+ onActivate: (id: number) => void;
14
+ onClose: (id: number) => void;
15
+ }
16
+
17
+ export default function TabBar({ tabs, activeId, onActivate, onClose }: TabBarProps) {
18
+ if (tabs.length === 0) return null;
19
+
20
+ return (
21
+ <div className="flex items-center border-b border-[var(--border)] bg-[var(--bg-tertiary)] overflow-x-auto shrink-0">
22
+ {tabs.map(tab => (
23
+ <div
24
+ key={tab.id}
25
+ className={`flex items-center gap-1 px-3 py-1.5 text-[11px] cursor-pointer border-r border-[var(--border)]/30 shrink-0 group ${
26
+ tab.id === activeId
27
+ ? 'bg-[var(--bg-primary)] text-[var(--text-primary)] border-b-2 border-b-[var(--accent)]'
28
+ : 'text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] hover:text-[var(--text-primary)]'
29
+ }`}
30
+ onClick={() => onActivate(tab.id)}
31
+ >
32
+ <span className="truncate max-w-[120px]">{tab.label}</span>
33
+ <button
34
+ onClick={(e) => {
35
+ e.stopPropagation();
36
+ onClose(tab.id);
37
+ }}
38
+ className="text-[9px] w-4 h-4 flex items-center justify-center rounded hover:bg-[var(--bg-tertiary)] text-[var(--text-secondary)] hover:text-[var(--text-primary)] opacity-0 group-hover:opacity-100 shrink-0"
39
+ >
40
+ x
41
+ </button>
42
+ </div>
43
+ ))}
44
+ </div>
45
+ );
46
+ }
package/lib/settings.ts CHANGED
@@ -26,6 +26,7 @@ export interface Settings {
26
26
  skillsRepoUrl: string; // GitHub raw URL for skills registry
27
27
  displayName: string; // User display name (shown in header)
28
28
  displayEmail: string; // User email (for session/future integrations)
29
+ favoriteProjects: string[]; // Favorite project paths (shown at top of sidebar)
29
30
  }
30
31
 
31
32
  const defaults: Settings = {
@@ -47,6 +48,7 @@ const defaults: Settings = {
47
48
  skillsRepoUrl: 'https://raw.githubusercontent.com/aiwatching/forge-skills/main',
48
49
  displayName: 'Forge',
49
50
  displayEmail: '',
51
+ favoriteProjects: [],
50
52
  };
51
53
 
52
54
  /** Load settings with secrets decrypted (for internal use) */
package/next-env.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /// <reference types="next" />
2
2
  /// <reference types="next/image-types/global" />
3
- import "./.next/dev/types/routes.d.ts";
3
+ import "./.next/types/routes.d.ts";
4
4
 
5
5
  // NOTE: This file should not be edited
6
6
  // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aion0/forge",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "description": "Unified AI workflow platform — multi-model task orchestration, persistent sessions, web terminal, remote access",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -149,6 +149,18 @@ function initSchema(db: Database.Database) {
149
149
  synced_at TEXT NOT NULL DEFAULT (datetime('now'))
150
150
  );
151
151
 
152
+ -- Tab state (projects, docs, etc)
153
+ CREATE TABLE IF NOT EXISTS tab_state (
154
+ type TEXT PRIMARY KEY,
155
+ data TEXT NOT NULL DEFAULT '{}'
156
+ );
157
+
158
+ -- Project favorites
159
+ CREATE TABLE IF NOT EXISTS project_favorites (
160
+ project_path TEXT PRIMARY KEY,
161
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
162
+ );
163
+
152
164
  -- Session watchers — monitor sessions and notify via Telegram
153
165
  CREATE TABLE IF NOT EXISTS session_watchers (
154
166
  id TEXT PRIMARY KEY,