Commit graph

90 commits

Author SHA1 Message Date
Jiayuan
7f25378e4b feat(cli): add binary build support for interactive CLI
Add esbuild-based build script to bundle CLI tools into standalone
binaries that can be run directly with node. The built binaries
externalize dependencies to keep bundle size small and avoid
bundling issues with native modules.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:22:53 +08:00
LinYushen
4f50b3b399
Merge pull request #31 from multica-ai/copy-env-file
feat(gateway): add PWA mobile client
2026-01-30 15:00:59 +08:00
yushen
f3ec056b90 feat(console): redesign Hub Console UI for desktop
- Stat cards grid (Device ID, Gateway, State, Agents) with copy buttons
- Connection state badge with colored dot indicator
- Inline gateway URL form with accent Connect button
- Agent table with hover-reveal copy and delete actions
- Toast notification on clipboard copy
- Centered container layout (960px max)
- Consistent dark theme matching Multica Client branding

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:59:00 +08:00
yushen
d9ba793fee fix(gateway): extract content from payload in received messages
Display payload.content instead of raw JSON when the payload
is an object with a content field.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:46:30 +08:00
yushen
7775ba5ca9 fix(gateway): stack target fields vertically for mobile
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:43:22 +08:00
yushen
e35aa95690 chore(gateway): rename client from Geneva to Multica
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:41:48 +08:00
yushen
25d447afc6 feat(gateway): polish PWA client UI for mobile
- Move disconnect button into header as a compact X icon
- Add app logo to header and setup screen
- Truncate device ID with tap-to-copy
- Collapsible target bar with smart label summary
- Empty state illustration when no messages
- Pulsing status dot animation for live connection
- Rounded send button, chat-bubble message input
- Glassmorphism header/compose bar with backdrop blur
- Auto-open target bar when targets not set
- Auto-collapse target bar after first send

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:39:31 +08:00
yushen
0f8db7083c fix(gateway): serve PWA client under /client subpath
Move static files from / to /client to avoid conflicts with
WebSocket and existing HTTP endpoints. Update manifest, service
worker, and HTML asset references accordingly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:35:40 +08:00
yushen
5f2cc06111 fix(gateway): fix Dockerfile build and copy static assets
- Replace `pnpm build` (turbo recursion) with direct `tsc` invocation
- Copy gateway/public static assets into dist for PWA serving

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:32:01 +08:00
yushen
1ddde840de chore(gateway): use provided PNG icon for PWA
Replace generated SVG icon with the provided PNG icon across
manifest, HTML, and service worker precache.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:27:45 +08:00
yushen
566f14f8ac feat(gateway): add PWA mobile client
Add a mobile-first PWA client served from the Gateway, mirroring the
console demo client functionality with enhanced mobile UX:
- Chat-bubble style messaging UI with safe-area support
- PWA manifest, service worker, and SVG icon
- ServeStaticModule added to Gateway for static file serving

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:24:28 +08:00
Jiayuan
75fba044bd
Merge pull request #30 from multica-ai/forrestchang/add-unit-tests
test: add comprehensive unit tests across the codebase
2026-01-30 14:13:10 +08:00
LinYushen
0bc5380765
Merge pull request #29 from multica-ai/agent-api-key-baseurl
feat(agent): add LLM provider config and Hub agent persistence
2026-01-30 14:08:26 +08:00
yushen
e5feb96b0b Merge remote-tracking branch 'origin/main' into agent-api-key-baseurl
# Conflicts:
#	src/shared/index.ts
2026-01-30 14:06:36 +08:00
Jiayuan
f6360c32d9 test(ssrf): expand SSRF test coverage
Add tests for createPinnedLookup, resolvePinnedHostname,
createPinnedDispatcher, and closeDispatcher functions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:01:00 +08:00
Jiayuan
44d0cef838 test(tools): add unit tests for glob and param-helpers
Add tests for:
- Glob tool pattern matching, limits, and ignore patterns
- Parameter helpers for string/number parsing and JSON results

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:00:53 +08:00
Jiayuan
5353161b1d test(skills): add unit tests for skills loader
Add tests for getProfileSkillsDir, getBundledSkillsDir, and loadAllSkills
with skill precedence, invalid files, and directory discovery.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:00:47 +08:00
Jiayuan
0f8d032b68 test(context): add unit tests for context window guard
Add tests for resolveContextWindowInfo, evaluateContextWindowGuard,
and checkContextWindow functions with various threshold scenarios.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:00:38 +08:00
yushen
c6d0476679 feat(hub): persist agent list to disk for restart recovery
Store agent records in ~/.super-multica/agents/agents.json.
Hub restores agents on startup and updates the file on create/delete.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:56:19 +08:00
Jiayuan
4201095519 test(profile): add unit tests for profile storage
Add tests for profile file storage operations including read,
write, load, and save functionality with temp directory isolation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:55:03 +08:00
Jiayuan
9345128367 test(context): add unit tests for token estimation and compaction
Add tests for:
- Token estimation and usage calculation
- Token-aware message compaction
- Count and token-based compaction strategies

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:54:57 +08:00
Jiayuan
de8ff730fb test(skills): add unit tests for parser and eligibility checker
Add tests for:
- YAML frontmatter parsing from SKILL.md files
- Skill eligibility checking (platform, binary, env requirements)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:54:50 +08:00
Jiayuan
9f5424eb5c test(web): add unit tests for SSRF, cache, and HTML utilities
Add comprehensive tests for:
- SSRF protection (isPrivateIpAddress, isBlockedHostname)
- Cache utilities (readCache, writeCache, TTL handling)
- HTML utilities (htmlToMarkdownSimple, markdownToText, truncateText)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:54:44 +08:00
Jiayuan
7215a15e37 chore: set up Vitest testing framework
Add Vitest and @vitest/coverage-v8 for unit testing. Configure
test scripts and add coverage directory to gitignore.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:54:34 +08:00
Jiayuan
a86774e7b5
chore(ci): add GitHub Actions workflow (#28) 2026-01-30 13:51:05 +08:00
Jiayuan
f74ac430a9
feat(shared): add error handling infrastructure (#27)
- Add JakartaError base class with error codes and retry semantics
- Add typed error classes for network, session, compaction, process, channel, and gateway errors
- Add withRetry utility with exponential backoff, jitter, and abort support
- Add CancellationToken with hierarchical parent-child cancellation support

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:50:49 +08:00
yushen
36e9acb35f refactor(shared): extract DATA_DIR constant to shared/paths.ts
Replace hardcoded ~/.super-multica paths across agent and hub modules
with a single DATA_DIR constant exported from shared.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:49:35 +08:00
yushen
98f3f7ed50 chore(agent): remove --env-file from agent:cli script
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:49:28 +08:00
yushen
a9dcde124b docs: add .env.example and environment configuration guide
- Add .env.example with all supported provider env vars
  (OpenAI, Anthropic, DeepSeek, Kimi, Groq, Mistral, Together, Google)
- Update README with environment setup instructions
- Document configuration priority and startup commands
- Whitelist .env.example in .gitignore

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:32:01 +08:00
yushen
0d1f48cf53 refactor(agent): rename env vars to LLM_PROVIDER and provider-specific MODEL
- AGENT_PROVIDER → LLM_PROVIDER
- AGENT_MODEL → provider-specific env vars (e.g., OPENAI_MODEL, DEEPSEEK_MODEL)
- Add resolveModelId function matching resolveApiKey/resolveBaseUrl pattern

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:20:20 +08:00
yushen
236863acd4 feat(agent): support AGENT_PROVIDER and AGENT_MODEL env vars
Add environment variable support for provider/model defaults:
- AGENT_PROVIDER: default LLM provider (fallback: kimi-coding)
- AGENT_MODEL: default model name
- Auto-load .env via tsx --env-file in agent:cli script

Priority: CLI args > env vars > session meta > defaults.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:15:11 +08:00
yushen
9858576abe feat(agent): support custom API key and base URL configuration
Add apiKey and baseUrl options to AgentOptions, with support for:
- Explicit values via CLI args (--api-key, --base-url)
- Provider-specific environment variables (e.g., OPENAI_BASE_URL)
- Generic fallback format (PROVIDER_BASE_URL)

Priority: CLI args > env vars > library defaults.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:12:24 +08:00
LinYushen
6f8c9ef383
Merge pull request #26 from multica-ai/view-recent-commits
feat(agent): add SyncAgent/AsyncAgent wrappers and integrate with Hub
2026-01-30 12:51:08 +08:00
yushen
0212b02f4e Merge remote-tracking branch 'origin/main' into view-recent-commits
# Conflicts:
#	.gitignore
2026-01-30 12:50:20 +08:00
yushen
e0615dbe69 chore: add .env to gitignore
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 12:48:22 +08:00
yushen
49540e63e7 refactor(hub): replace mock Agent with AsyncAgent
Hub now uses AsyncAgent from src/agent/ instead of its own Agent
implementation. Deleted hub/agent.ts and hub/channel.ts as they
are no longer needed.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:58:21 +08:00
yushen
da80ba1cb0 refactor(agent): simplify AsyncAgent to use result.text instead of stream interception
Replace stdout/stderr stream interception with direct result.text push
to Channel. Also fix queued tasks still executing after close().

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:52:01 +08:00
yushen
6e82219630 feat(agent): add SyncAgent and AsyncAgent wrapper classes
Introduce two wrapper classes around the core Agent:
- SyncAgent: exposes run() for synchronous request-response usage
- AsyncAgent: exposes write()/read()/close() for non-blocking streaming via Channel

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:37:09 +08:00
Naiyuan Qing
438b1bd8d1
Merge pull request #25 from multica-ai/feat/extract-packages-ui
feat: extract shared packages (ui, store) and scaffold desktop app
2026-01-30 11:35:20 +08:00
Naiyuan Qing
6cc3a375e7 chore(desktop): clean up build artifacts and unused code
- Add dist-electron and release to .gitignore
- Remove tracked dist-electron build outputs from git
- Remove unused createRequire import in electron/main.ts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:09 +08:00
Naiyuan Qing
d7d2861a79 feat(store): add shared Zustand store package with counter example
- Create packages/store with @multica/store package
- Add zustand to pnpm catalog for version consistency
- Add counter store as cross-platform state example
- Integrate counter into ComponentExample for verification
- Add tsconfig path mappings for web and desktop
- Add @multica/store to Next.js transpilePackages
- Add @multica/store dependency to packages/ui

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:09 +08:00
Naiyuan Qing
eb5c388a80 refactor(ui): reorganize components into ui/ subdirectory and share layout
- Move shadcn components from src/components/ to src/components/ui/
- Move component-example and example from apps/web to packages/ui
- Update package.json exports with separate components/* and components/ui/* paths
- Update components.json ui alias in both packages/ui and apps/web
- Add missing @import "shadcn/tailwind.css" to globals.css
- Add new UI components: sheet, sidebar, skeleton, switch
- Update apps/web and apps/desktop to use shared ComponentExample

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:09 +08:00
Naiyuan Qing
141af9e9f1 feat(desktop): integrate @multica/ui shared components
Add @multica/ui workspace dependency with @tailwindcss/vite plugin
for CSS processing. Import globals.css for theme and replace template
UI with shared Button component. Remove unused template CSS files.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:09 +08:00
Naiyuan Qing
6431829b0c chore: unify shared deps with pnpm catalogs
Add catalog section to pnpm-workspace.yaml for react, react-dom,
@types/react, @types/react-dom, @types/node, and typescript.
Update all package.json files to use catalog: protocol.
Upgrade desktop from React 18 to 19. Rename to @multica/desktop.
Add dev:desktop script to root.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:09 +08:00
Naiyuan Qing
ff026b122d feat(desktop): scaffold Electron app with Vite
Add initial Electron desktop app using vite-plugin-electron template
with React and TypeScript.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:09 +08:00
Naiyuan Qing
663a9ec2a7 chore: update lockfile for packages/ui dependencies
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:05 +08:00
Naiyuan Qing
ae2a28037b chore: update .gitignore for monorepo build outputs
Add rules for .next, .turbo, build, tsbuildinfo, env files, and
platform-specific binaries (dmg, app, apk, ipa).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:05 +08:00
Naiyuan Qing
5c240ab363 refactor(web): update imports to use @multica/ui package
Replace local UI component and utility imports with @multica/ui
subpath imports. Remove old components/ui/ directory, lib/utils.ts,
and globals.css. Configure postcss, next.config, and tsconfig for
monorepo UI package consumption.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:05 +08:00
Naiyuan Qing
c1129ff37d feat(ui): extract components, utils, and styles from apps/web
Move 13 shadcn UI components, cn() utility, and theme CSS variables
to packages/ui for cross-platform reuse. Add @source directives for
Tailwind v4 content scanning.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:05 +08:00
Naiyuan Qing
e1443720eb feat(ui): create @multica/ui package skeleton
Shared UI package for web, electron, and mobile. Uses subpath exports
following the official shadcn monorepo template pattern.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:34:05 +08:00