@aexol/spectral 0.7.0 → 0.7.3
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.
- package/CHANGELOG.md +5 -0
- package/dist/agent/agents.js +1 -1
- package/dist/agent/index.js +269 -479
- package/dist/cli.js +11 -0
- package/dist/commands/serve.js +0 -3
- package/dist/designer/data/systems/agentic/DESIGN.md +71 -0
- package/dist/designer/data/systems/agentic/components.html +154 -0
- package/dist/designer/data/systems/agentic/tokens.css +63 -0
- package/dist/designer/data/systems/airbnb/DESIGN.md +393 -0
- package/dist/designer/data/systems/airbnb/components.html +1373 -0
- package/dist/designer/data/systems/airbnb/tokens.css +261 -0
- package/dist/designer/data/systems/airtable/DESIGN.md +92 -0
- package/dist/designer/data/systems/airtable/components.html +489 -0
- package/dist/designer/data/systems/airtable/tokens.css +261 -0
- package/dist/designer/data/systems/ant/DESIGN.md +71 -0
- package/dist/designer/data/systems/ant/components.html +154 -0
- package/dist/designer/data/systems/ant/tokens.css +63 -0
- package/dist/designer/data/systems/apple/DESIGN.md +250 -0
- package/dist/designer/data/systems/apple/components.html +749 -0
- package/dist/designer/data/systems/apple/tokens.css +286 -0
- package/dist/designer/data/systems/application/DESIGN.md +71 -0
- package/dist/designer/data/systems/application/components.html +154 -0
- package/dist/designer/data/systems/application/tokens.css +63 -0
- package/dist/designer/data/systems/arc/DESIGN.md +152 -0
- package/dist/designer/data/systems/arc/components.html +432 -0
- package/dist/designer/data/systems/arc/tokens.css +137 -0
- package/dist/designer/data/systems/artistic/DESIGN.md +71 -0
- package/dist/designer/data/systems/artistic/components.html +136 -0
- package/dist/designer/data/systems/artistic/tokens.css +63 -0
- package/dist/designer/data/systems/atelier-zero/DESIGN.md +316 -0
- package/dist/designer/data/systems/atelier-zero/components.html +136 -0
- package/dist/designer/data/systems/atelier-zero/tokens.css +63 -0
- package/dist/designer/data/systems/bento/DESIGN.md +71 -0
- package/dist/designer/data/systems/bento/components.html +136 -0
- package/dist/designer/data/systems/bento/tokens.css +63 -0
- package/dist/designer/data/systems/binance/DESIGN.md +348 -0
- package/dist/designer/data/systems/binance/components.html +550 -0
- package/dist/designer/data/systems/binance/tokens.css +255 -0
- package/dist/designer/data/systems/bmw/DESIGN.md +183 -0
- package/dist/designer/data/systems/bmw/components.html +551 -0
- package/dist/designer/data/systems/bmw/tokens.css +179 -0
- package/dist/designer/data/systems/bmw-m/DESIGN.md +246 -0
- package/dist/designer/data/systems/bmw-m/components.html +342 -0
- package/dist/designer/data/systems/bmw-m/tokens.css +64 -0
- package/dist/designer/data/systems/bold/DESIGN.md +71 -0
- package/dist/designer/data/systems/bold/components.html +136 -0
- package/dist/designer/data/systems/bold/tokens.css +63 -0
- package/dist/designer/data/systems/brutalism/DESIGN.md +71 -0
- package/dist/designer/data/systems/brutalism/components.html +154 -0
- package/dist/designer/data/systems/brutalism/tokens.css +63 -0
- package/dist/designer/data/systems/bugatti/DESIGN.md +271 -0
- package/dist/designer/data/systems/bugatti/components.html +342 -0
- package/dist/designer/data/systems/bugatti/tokens.css +64 -0
- package/dist/designer/data/systems/cafe/DESIGN.md +71 -0
- package/dist/designer/data/systems/cafe/components.html +136 -0
- package/dist/designer/data/systems/cafe/tokens.css +63 -0
- package/dist/designer/data/systems/cal/DESIGN.md +262 -0
- package/dist/designer/data/systems/cal/components.html +376 -0
- package/dist/designer/data/systems/cal/tokens.css +265 -0
- package/dist/designer/data/systems/canva/DESIGN.md +157 -0
- package/dist/designer/data/systems/canva/components.html +461 -0
- package/dist/designer/data/systems/canva/tokens.css +147 -0
- package/dist/designer/data/systems/cisco/DESIGN.md +201 -0
- package/dist/designer/data/systems/cisco/components.html +342 -0
- package/dist/designer/data/systems/cisco/tokens.css +64 -0
- package/dist/designer/data/systems/claude/DESIGN.md +315 -0
- package/dist/designer/data/systems/claude/components.html +483 -0
- package/dist/designer/data/systems/claude/tokens.css +130 -0
- package/dist/designer/data/systems/clay/DESIGN.md +307 -0
- package/dist/designer/data/systems/clay/components.html +136 -0
- package/dist/designer/data/systems/clay/tokens.css +63 -0
- package/dist/designer/data/systems/claymorphism/DESIGN.md +71 -0
- package/dist/designer/data/systems/claymorphism/components.html +136 -0
- package/dist/designer/data/systems/claymorphism/tokens.css +63 -0
- package/dist/designer/data/systems/clean/DESIGN.md +71 -0
- package/dist/designer/data/systems/clean/components.html +136 -0
- package/dist/designer/data/systems/clean/tokens.css +63 -0
- package/dist/designer/data/systems/clickhouse/DESIGN.md +284 -0
- package/dist/designer/data/systems/clickhouse/components.html +506 -0
- package/dist/designer/data/systems/clickhouse/tokens.css +135 -0
- package/dist/designer/data/systems/cohere/DESIGN.md +269 -0
- package/dist/designer/data/systems/cohere/components.html +353 -0
- package/dist/designer/data/systems/cohere/tokens.css +126 -0
- package/dist/designer/data/systems/coinbase/DESIGN.md +132 -0
- package/dist/designer/data/systems/coinbase/components.html +501 -0
- package/dist/designer/data/systems/coinbase/tokens.css +257 -0
- package/dist/designer/data/systems/colorful/DESIGN.md +71 -0
- package/dist/designer/data/systems/colorful/components.html +136 -0
- package/dist/designer/data/systems/colorful/tokens.css +63 -0
- package/dist/designer/data/systems/composio/DESIGN.md +310 -0
- package/dist/designer/data/systems/composio/components.html +342 -0
- package/dist/designer/data/systems/composio/tokens.css +64 -0
- package/dist/designer/data/systems/contemporary/DESIGN.md +71 -0
- package/dist/designer/data/systems/contemporary/components.html +136 -0
- package/dist/designer/data/systems/contemporary/tokens.css +63 -0
- package/dist/designer/data/systems/corporate/DESIGN.md +71 -0
- package/dist/designer/data/systems/corporate/components.html +136 -0
- package/dist/designer/data/systems/corporate/tokens.css +63 -0
- package/dist/designer/data/systems/cosmic/DESIGN.md +71 -0
- package/dist/designer/data/systems/cosmic/components.html +136 -0
- package/dist/designer/data/systems/cosmic/tokens.css +63 -0
- package/dist/designer/data/systems/creative/DESIGN.md +71 -0
- package/dist/designer/data/systems/creative/components.html +136 -0
- package/dist/designer/data/systems/creative/tokens.css +63 -0
- package/dist/designer/data/systems/cursor/DESIGN.md +312 -0
- package/dist/designer/data/systems/cursor/components.html +654 -0
- package/dist/designer/data/systems/cursor/tokens.css +218 -0
- package/dist/designer/data/systems/dashboard/DESIGN.md +71 -0
- package/dist/designer/data/systems/dashboard/components.html +154 -0
- package/dist/designer/data/systems/dashboard/tokens.css +63 -0
- package/dist/designer/data/systems/default/DESIGN.md +62 -0
- package/dist/designer/data/systems/default/components.html +523 -0
- package/dist/designer/data/systems/default/tokens.css +200 -0
- package/dist/designer/data/systems/discord/DESIGN.md +162 -0
- package/dist/designer/data/systems/discord/components.html +359 -0
- package/dist/designer/data/systems/discord/tokens.css +125 -0
- package/dist/designer/data/systems/dithered/DESIGN.md +71 -0
- package/dist/designer/data/systems/dithered/components.html +136 -0
- package/dist/designer/data/systems/dithered/tokens.css +63 -0
- package/dist/designer/data/systems/doodle/DESIGN.md +71 -0
- package/dist/designer/data/systems/doodle/components.html +136 -0
- package/dist/designer/data/systems/doodle/tokens.css +63 -0
- package/dist/designer/data/systems/dramatic/DESIGN.md +71 -0
- package/dist/designer/data/systems/dramatic/components.html +136 -0
- package/dist/designer/data/systems/dramatic/tokens.css +63 -0
- package/dist/designer/data/systems/duolingo/DESIGN.md +154 -0
- package/dist/designer/data/systems/duolingo/components.html +532 -0
- package/dist/designer/data/systems/duolingo/tokens.css +130 -0
- package/dist/designer/data/systems/editorial/DESIGN.md +71 -0
- package/dist/designer/data/systems/editorial/components.html +154 -0
- package/dist/designer/data/systems/editorial/tokens.css +63 -0
- package/dist/designer/data/systems/elegant/DESIGN.md +71 -0
- package/dist/designer/data/systems/elegant/components.html +136 -0
- package/dist/designer/data/systems/elegant/tokens.css +63 -0
- package/dist/designer/data/systems/elevenlabs/DESIGN.md +268 -0
- package/dist/designer/data/systems/elevenlabs/components.html +342 -0
- package/dist/designer/data/systems/elevenlabs/tokens.css +127 -0
- package/dist/designer/data/systems/energetic/DESIGN.md +72 -0
- package/dist/designer/data/systems/energetic/components.html +136 -0
- package/dist/designer/data/systems/energetic/tokens.css +63 -0
- package/dist/designer/data/systems/enterprise/DESIGN.md +71 -0
- package/dist/designer/data/systems/enterprise/components.html +154 -0
- package/dist/designer/data/systems/enterprise/tokens.css +63 -0
- package/dist/designer/data/systems/expo/DESIGN.md +284 -0
- package/dist/designer/data/systems/expo/components.html +342 -0
- package/dist/designer/data/systems/expo/tokens.css +64 -0
- package/dist/designer/data/systems/expressive/DESIGN.md +71 -0
- package/dist/designer/data/systems/expressive/components.html +136 -0
- package/dist/designer/data/systems/expressive/tokens.css +63 -0
- package/dist/designer/data/systems/fantasy/DESIGN.md +71 -0
- package/dist/designer/data/systems/fantasy/components.html +136 -0
- package/dist/designer/data/systems/fantasy/tokens.css +63 -0
- package/dist/designer/data/systems/ferrari/DESIGN.md +317 -0
- package/dist/designer/data/systems/ferrari/components.html +342 -0
- package/dist/designer/data/systems/ferrari/tokens.css +64 -0
- package/dist/designer/data/systems/figma/DESIGN.md +223 -0
- package/dist/designer/data/systems/figma/components.html +344 -0
- package/dist/designer/data/systems/figma/tokens.css +126 -0
- package/dist/designer/data/systems/flat/DESIGN.md +71 -0
- package/dist/designer/data/systems/flat/components.html +136 -0
- package/dist/designer/data/systems/flat/tokens.css +63 -0
- package/dist/designer/data/systems/framer/DESIGN.md +249 -0
- package/dist/designer/data/systems/framer/components.html +438 -0
- package/dist/designer/data/systems/framer/tokens.css +238 -0
- package/dist/designer/data/systems/friendly/DESIGN.md +71 -0
- package/dist/designer/data/systems/friendly/components.html +136 -0
- package/dist/designer/data/systems/friendly/tokens.css +63 -0
- package/dist/designer/data/systems/futuristic/DESIGN.md +71 -0
- package/dist/designer/data/systems/futuristic/components.html +136 -0
- package/dist/designer/data/systems/futuristic/tokens.css +63 -0
- package/dist/designer/data/systems/github/DESIGN.md +155 -0
- package/dist/designer/data/systems/github/components.html +383 -0
- package/dist/designer/data/systems/github/tokens.css +125 -0
- package/dist/designer/data/systems/glassmorphism/DESIGN.md +71 -0
- package/dist/designer/data/systems/glassmorphism/components.html +154 -0
- package/dist/designer/data/systems/glassmorphism/tokens.css +63 -0
- package/dist/designer/data/systems/gradient/DESIGN.md +71 -0
- package/dist/designer/data/systems/gradient/components.html +154 -0
- package/dist/designer/data/systems/gradient/tokens.css +63 -0
- package/dist/designer/data/systems/hashicorp/DESIGN.md +281 -0
- package/dist/designer/data/systems/hashicorp/components.html +502 -0
- package/dist/designer/data/systems/hashicorp/tokens.css +272 -0
- package/dist/designer/data/systems/hud/DESIGN.md +173 -0
- package/dist/designer/data/systems/hud/components.html +136 -0
- package/dist/designer/data/systems/hud/tokens.css +63 -0
- package/dist/designer/data/systems/huggingface/DESIGN.md +149 -0
- package/dist/designer/data/systems/huggingface/components.html +346 -0
- package/dist/designer/data/systems/huggingface/tokens.css +125 -0
- package/dist/designer/data/systems/ibm/DESIGN.md +335 -0
- package/dist/designer/data/systems/ibm/components.html +342 -0
- package/dist/designer/data/systems/ibm/tokens.css +64 -0
- package/dist/designer/data/systems/intercom/DESIGN.md +149 -0
- package/dist/designer/data/systems/intercom/components.html +557 -0
- package/dist/designer/data/systems/intercom/tokens.css +150 -0
- package/dist/designer/data/systems/kami/DESIGN.md +410 -0
- package/dist/designer/data/systems/kami/components.html +601 -0
- package/dist/designer/data/systems/kami/tokens.css +272 -0
- package/dist/designer/data/systems/kraken/DESIGN.md +128 -0
- package/dist/designer/data/systems/kraken/components.html +342 -0
- package/dist/designer/data/systems/kraken/tokens.css +64 -0
- package/dist/designer/data/systems/lamborghini/DESIGN.md +291 -0
- package/dist/designer/data/systems/lamborghini/components.html +342 -0
- package/dist/designer/data/systems/lamborghini/tokens.css +64 -0
- package/dist/designer/data/systems/levels/DESIGN.md +71 -0
- package/dist/designer/data/systems/levels/components.html +154 -0
- package/dist/designer/data/systems/levels/tokens.css +63 -0
- package/dist/designer/data/systems/linear-app/DESIGN.md +370 -0
- package/dist/designer/data/systems/linear-app/components.html +370 -0
- package/dist/designer/data/systems/linear-app/tokens.css +130 -0
- package/dist/designer/data/systems/lingo/DESIGN.md +71 -0
- package/dist/designer/data/systems/lingo/components.html +154 -0
- package/dist/designer/data/systems/lingo/tokens.css +63 -0
- package/dist/designer/data/systems/loom/DESIGN.md +201 -0
- package/dist/designer/data/systems/loom/components.html +446 -0
- package/dist/designer/data/systems/loom/tokens.css +138 -0
- package/dist/designer/data/systems/lovable/DESIGN.md +301 -0
- package/dist/designer/data/systems/lovable/components.html +441 -0
- package/dist/designer/data/systems/lovable/tokens.css +258 -0
- package/dist/designer/data/systems/luxury/DESIGN.md +71 -0
- package/dist/designer/data/systems/luxury/components.html +154 -0
- package/dist/designer/data/systems/luxury/tokens.css +63 -0
- package/dist/designer/data/systems/mastercard/DESIGN.md +368 -0
- package/dist/designer/data/systems/mastercard/components.html +342 -0
- package/dist/designer/data/systems/mastercard/tokens.css +64 -0
- package/dist/designer/data/systems/material/DESIGN.md +71 -0
- package/dist/designer/data/systems/material/components.html +154 -0
- package/dist/designer/data/systems/material/tokens.css +63 -0
- package/dist/designer/data/systems/meta/DESIGN.md +369 -0
- package/dist/designer/data/systems/meta/components.html +398 -0
- package/dist/designer/data/systems/meta/tokens.css +263 -0
- package/dist/designer/data/systems/minimal/DESIGN.md +71 -0
- package/dist/designer/data/systems/minimal/components.html +154 -0
- package/dist/designer/data/systems/minimal/tokens.css +63 -0
- package/dist/designer/data/systems/minimax/DESIGN.md +260 -0
- package/dist/designer/data/systems/minimax/components.html +590 -0
- package/dist/designer/data/systems/minimax/tokens.css +148 -0
- package/dist/designer/data/systems/mintlify/DESIGN.md +329 -0
- package/dist/designer/data/systems/mintlify/components.html +737 -0
- package/dist/designer/data/systems/mintlify/tokens.css +256 -0
- package/dist/designer/data/systems/miro/DESIGN.md +111 -0
- package/dist/designer/data/systems/miro/components.html +342 -0
- package/dist/designer/data/systems/miro/tokens.css +64 -0
- package/dist/designer/data/systems/mission-control/DESIGN.md +474 -0
- package/dist/designer/data/systems/mission-control/components.html +136 -0
- package/dist/designer/data/systems/mission-control/tokens.css +63 -0
- package/dist/designer/data/systems/mistral-ai/DESIGN.md +264 -0
- package/dist/designer/data/systems/mistral-ai/components.html +338 -0
- package/dist/designer/data/systems/mistral-ai/tokens.css +125 -0
- package/dist/designer/data/systems/modern/DESIGN.md +71 -0
- package/dist/designer/data/systems/modern/components.html +154 -0
- package/dist/designer/data/systems/modern/tokens.css +63 -0
- package/dist/designer/data/systems/mongodb/DESIGN.md +269 -0
- package/dist/designer/data/systems/mongodb/components.html +462 -0
- package/dist/designer/data/systems/mongodb/tokens.css +176 -0
- package/dist/designer/data/systems/mono/DESIGN.md +71 -0
- package/dist/designer/data/systems/mono/components.html +136 -0
- package/dist/designer/data/systems/mono/tokens.css +63 -0
- package/dist/designer/data/systems/neobrutalism/DESIGN.md +71 -0
- package/dist/designer/data/systems/neobrutalism/components.html +136 -0
- package/dist/designer/data/systems/neobrutalism/tokens.css +63 -0
- package/dist/designer/data/systems/neon/DESIGN.md +71 -0
- package/dist/designer/data/systems/neon/components.html +136 -0
- package/dist/designer/data/systems/neon/tokens.css +63 -0
- package/dist/designer/data/systems/neumorphism/DESIGN.md +71 -0
- package/dist/designer/data/systems/neumorphism/components.html +136 -0
- package/dist/designer/data/systems/neumorphism/tokens.css +63 -0
- package/dist/designer/data/systems/nike/DESIGN.md +366 -0
- package/dist/designer/data/systems/nike/components.html +512 -0
- package/dist/designer/data/systems/nike/tokens.css +304 -0
- package/dist/designer/data/systems/notion/DESIGN.md +312 -0
- package/dist/designer/data/systems/notion/components.html +413 -0
- package/dist/designer/data/systems/notion/tokens.css +130 -0
- package/dist/designer/data/systems/nvidia/DESIGN.md +296 -0
- package/dist/designer/data/systems/nvidia/components.html +414 -0
- package/dist/designer/data/systems/nvidia/tokens.css +133 -0
- package/dist/designer/data/systems/ollama/DESIGN.md +270 -0
- package/dist/designer/data/systems/ollama/components.html +700 -0
- package/dist/designer/data/systems/ollama/tokens.css +242 -0
- package/dist/designer/data/systems/openai/DESIGN.md +140 -0
- package/dist/designer/data/systems/openai/components.html +382 -0
- package/dist/designer/data/systems/openai/tokens.css +133 -0
- package/dist/designer/data/systems/opencode-ai/DESIGN.md +284 -0
- package/dist/designer/data/systems/opencode-ai/components.html +389 -0
- package/dist/designer/data/systems/opencode-ai/tokens.css +126 -0
- package/dist/designer/data/systems/pacman/DESIGN.md +71 -0
- package/dist/designer/data/systems/pacman/components.html +342 -0
- package/dist/designer/data/systems/pacman/tokens.css +64 -0
- package/dist/designer/data/systems/paper/DESIGN.md +71 -0
- package/dist/designer/data/systems/paper/components.html +136 -0
- package/dist/designer/data/systems/paper/tokens.css +63 -0
- package/dist/designer/data/systems/perplexity/DESIGN.md +286 -0
- package/dist/designer/data/systems/perplexity/components.html +455 -0
- package/dist/designer/data/systems/perplexity/tokens.css +151 -0
- package/dist/designer/data/systems/perspective/DESIGN.md +71 -0
- package/dist/designer/data/systems/perspective/components.html +136 -0
- package/dist/designer/data/systems/perspective/tokens.css +63 -0
- package/dist/designer/data/systems/pinterest/DESIGN.md +233 -0
- package/dist/designer/data/systems/pinterest/components.html +865 -0
- package/dist/designer/data/systems/pinterest/tokens.css +262 -0
- package/dist/designer/data/systems/playstation/DESIGN.md +367 -0
- package/dist/designer/data/systems/playstation/components.html +414 -0
- package/dist/designer/data/systems/playstation/tokens.css +150 -0
- package/dist/designer/data/systems/posthog/DESIGN.md +259 -0
- package/dist/designer/data/systems/posthog/components.html +827 -0
- package/dist/designer/data/systems/posthog/tokens.css +272 -0
- package/dist/designer/data/systems/premium/DESIGN.md +71 -0
- package/dist/designer/data/systems/premium/components.html +154 -0
- package/dist/designer/data/systems/premium/tokens.css +63 -0
- package/dist/designer/data/systems/professional/DESIGN.md +71 -0
- package/dist/designer/data/systems/professional/components.html +136 -0
- package/dist/designer/data/systems/professional/tokens.css +63 -0
- package/dist/designer/data/systems/publication/DESIGN.md +71 -0
- package/dist/designer/data/systems/publication/components.html +154 -0
- package/dist/designer/data/systems/publication/tokens.css +63 -0
- package/dist/designer/data/systems/raycast/DESIGN.md +271 -0
- package/dist/designer/data/systems/raycast/components.html +507 -0
- package/dist/designer/data/systems/raycast/tokens.css +143 -0
- package/dist/designer/data/systems/refined/DESIGN.md +71 -0
- package/dist/designer/data/systems/refined/components.html +136 -0
- package/dist/designer/data/systems/refined/tokens.css +63 -0
- package/dist/designer/data/systems/renault/DESIGN.md +314 -0
- package/dist/designer/data/systems/renault/components.html +154 -0
- package/dist/designer/data/systems/renault/tokens.css +63 -0
- package/dist/designer/data/systems/replicate/DESIGN.md +264 -0
- package/dist/designer/data/systems/replicate/components.html +340 -0
- package/dist/designer/data/systems/replicate/tokens.css +125 -0
- package/dist/designer/data/systems/resend/DESIGN.md +306 -0
- package/dist/designer/data/systems/resend/components.html +839 -0
- package/dist/designer/data/systems/resend/tokens.css +353 -0
- package/dist/designer/data/systems/retro/DESIGN.md +71 -0
- package/dist/designer/data/systems/retro/components.html +136 -0
- package/dist/designer/data/systems/retro/tokens.css +63 -0
- package/dist/designer/data/systems/revolut/DESIGN.md +188 -0
- package/dist/designer/data/systems/revolut/components.html +342 -0
- package/dist/designer/data/systems/revolut/tokens.css +64 -0
- package/dist/designer/data/systems/runwayml/DESIGN.md +247 -0
- package/dist/designer/data/systems/runwayml/components.html +638 -0
- package/dist/designer/data/systems/runwayml/tokens.css +204 -0
- package/dist/designer/data/systems/sanity/DESIGN.md +360 -0
- package/dist/designer/data/systems/sanity/components.html +342 -0
- package/dist/designer/data/systems/sanity/tokens.css +64 -0
- package/dist/designer/data/systems/sentry/DESIGN.md +265 -0
- package/dist/designer/data/systems/sentry/components.html +387 -0
- package/dist/designer/data/systems/sentry/tokens.css +219 -0
- package/dist/designer/data/systems/shadcn/DESIGN.md +71 -0
- package/dist/designer/data/systems/shadcn/components.html +732 -0
- package/dist/designer/data/systems/shadcn/tokens.css +255 -0
- package/dist/designer/data/systems/shopify/DESIGN.md +353 -0
- package/dist/designer/data/systems/shopify/components.html +342 -0
- package/dist/designer/data/systems/shopify/tokens.css +141 -0
- package/dist/designer/data/systems/simple/DESIGN.md +71 -0
- package/dist/designer/data/systems/simple/components.html +136 -0
- package/dist/designer/data/systems/simple/tokens.css +63 -0
- package/dist/designer/data/systems/skeumorphism/DESIGN.md +71 -0
- package/dist/designer/data/systems/skeumorphism/components.html +136 -0
- package/dist/designer/data/systems/skeumorphism/tokens.css +63 -0
- package/dist/designer/data/systems/slack/DESIGN.md +363 -0
- package/dist/designer/data/systems/slack/components.html +387 -0
- package/dist/designer/data/systems/slack/tokens.css +127 -0
- package/dist/designer/data/systems/sleek/DESIGN.md +71 -0
- package/dist/designer/data/systems/sleek/components.html +136 -0
- package/dist/designer/data/systems/sleek/tokens.css +63 -0
- package/dist/designer/data/systems/spacex/DESIGN.md +197 -0
- package/dist/designer/data/systems/spacex/components.html +496 -0
- package/dist/designer/data/systems/spacex/tokens.css +154 -0
- package/dist/designer/data/systems/spacious/DESIGN.md +71 -0
- package/dist/designer/data/systems/spacious/components.html +136 -0
- package/dist/designer/data/systems/spacious/tokens.css +63 -0
- package/dist/designer/data/systems/spotify/DESIGN.md +249 -0
- package/dist/designer/data/systems/spotify/components.html +365 -0
- package/dist/designer/data/systems/spotify/tokens.css +127 -0
- package/dist/designer/data/systems/starbucks/DESIGN.md +583 -0
- package/dist/designer/data/systems/starbucks/components.html +493 -0
- package/dist/designer/data/systems/starbucks/tokens.css +182 -0
- package/dist/designer/data/systems/storytelling/DESIGN.md +71 -0
- package/dist/designer/data/systems/storytelling/components.html +136 -0
- package/dist/designer/data/systems/storytelling/tokens.css +63 -0
- package/dist/designer/data/systems/stripe/DESIGN.md +325 -0
- package/dist/designer/data/systems/stripe/components.html +1018 -0
- package/dist/designer/data/systems/stripe/tokens.css +295 -0
- package/dist/designer/data/systems/supabase/DESIGN.md +258 -0
- package/dist/designer/data/systems/supabase/components.html +741 -0
- package/dist/designer/data/systems/supabase/tokens.css +294 -0
- package/dist/designer/data/systems/superhuman/DESIGN.md +255 -0
- package/dist/designer/data/systems/superhuman/components.html +537 -0
- package/dist/designer/data/systems/superhuman/tokens.css +160 -0
- package/dist/designer/data/systems/tesla/DESIGN.md +289 -0
- package/dist/designer/data/systems/tesla/components.html +724 -0
- package/dist/designer/data/systems/tesla/tokens.css +285 -0
- package/dist/designer/data/systems/tetris/DESIGN.md +71 -0
- package/dist/designer/data/systems/tetris/components.html +342 -0
- package/dist/designer/data/systems/tetris/tokens.css +64 -0
- package/dist/designer/data/systems/theverge/DESIGN.md +342 -0
- package/dist/designer/data/systems/theverge/components.html +342 -0
- package/dist/designer/data/systems/theverge/tokens.css +64 -0
- package/dist/designer/data/systems/together-ai/DESIGN.md +266 -0
- package/dist/designer/data/systems/together-ai/components.html +422 -0
- package/dist/designer/data/systems/together-ai/tokens.css +127 -0
- package/dist/designer/data/systems/totality-festival/DESIGN.md +206 -0
- package/dist/designer/data/systems/totality-festival/components.html +136 -0
- package/dist/designer/data/systems/totality-festival/tokens.css +63 -0
- package/dist/designer/data/systems/trading-terminal/DESIGN.md +178 -0
- package/dist/designer/data/systems/trading-terminal/components.html +154 -0
- package/dist/designer/data/systems/trading-terminal/tokens.css +63 -0
- package/dist/designer/data/systems/uber/DESIGN.md +298 -0
- package/dist/designer/data/systems/uber/components.html +347 -0
- package/dist/designer/data/systems/uber/tokens.css +131 -0
- package/dist/designer/data/systems/urdu/DESIGN.md +1002 -0
- package/dist/designer/data/systems/urdu/components.html +136 -0
- package/dist/designer/data/systems/urdu/tokens.css +63 -0
- package/dist/designer/data/systems/vercel/DESIGN.md +313 -0
- package/dist/designer/data/systems/vercel/components.html +839 -0
- package/dist/designer/data/systems/vercel/tokens.css +270 -0
- package/dist/designer/data/systems/vibrant/DESIGN.md +71 -0
- package/dist/designer/data/systems/vibrant/components.html +136 -0
- package/dist/designer/data/systems/vibrant/tokens.css +63 -0
- package/dist/designer/data/systems/vintage/DESIGN.md +71 -0
- package/dist/designer/data/systems/vintage/components.html +136 -0
- package/dist/designer/data/systems/vintage/tokens.css +63 -0
- package/dist/designer/data/systems/vodafone/DESIGN.md +426 -0
- package/dist/designer/data/systems/vodafone/components.html +342 -0
- package/dist/designer/data/systems/vodafone/tokens.css +64 -0
- package/dist/designer/data/systems/voltagent/DESIGN.md +326 -0
- package/dist/designer/data/systems/voltagent/components.html +154 -0
- package/dist/designer/data/systems/voltagent/tokens.css +63 -0
- package/dist/designer/data/systems/warm-editorial/DESIGN.md +65 -0
- package/dist/designer/data/systems/warm-editorial/components.html +136 -0
- package/dist/designer/data/systems/warm-editorial/tokens.css +63 -0
- package/dist/designer/data/systems/warp/DESIGN.md +256 -0
- package/dist/designer/data/systems/warp/components.html +411 -0
- package/dist/designer/data/systems/warp/tokens.css +156 -0
- package/dist/designer/data/systems/webex/DESIGN.md +207 -0
- package/dist/designer/data/systems/webex/components.html +342 -0
- package/dist/designer/data/systems/webex/tokens.css +64 -0
- package/dist/designer/data/systems/webflow/DESIGN.md +95 -0
- package/dist/designer/data/systems/webflow/components.html +413 -0
- package/dist/designer/data/systems/webflow/tokens.css +191 -0
- package/dist/designer/data/systems/wechat/DESIGN.md +302 -0
- package/dist/designer/data/systems/wechat/components.html +507 -0
- package/dist/designer/data/systems/wechat/tokens.css +176 -0
- package/dist/designer/data/systems/wired/DESIGN.md +281 -0
- package/dist/designer/data/systems/wired/components.html +342 -0
- package/dist/designer/data/systems/wired/tokens.css +64 -0
- package/dist/designer/data/systems/wise/DESIGN.md +176 -0
- package/dist/designer/data/systems/wise/components.html +365 -0
- package/dist/designer/data/systems/wise/tokens.css +141 -0
- package/dist/designer/data/systems/x-ai/DESIGN.md +260 -0
- package/dist/designer/data/systems/x-ai/components.html +460 -0
- package/dist/designer/data/systems/x-ai/tokens.css +268 -0
- package/dist/designer/data/systems/xiaohongshu/DESIGN.md +402 -0
- package/dist/designer/data/systems/xiaohongshu/components.html +865 -0
- package/dist/designer/data/systems/xiaohongshu/tokens.css +193 -0
- package/dist/designer/data/systems/zapier/DESIGN.md +331 -0
- package/dist/designer/data/systems/zapier/components.html +342 -0
- package/dist/designer/data/systems/zapier/tokens.css +64 -0
- package/dist/designer/guidelines.js +176 -0
- package/dist/designer/index.js +236 -0
- package/dist/designer/philosophies.js +668 -0
- package/dist/designer/skills.js +1675 -0
- package/dist/designer/systems.js +216 -0
- package/dist/mcp/sampling-handler.js +1 -1
- package/dist/memory/commands/status.js +1 -1
- package/dist/memory/compaction.js +2 -2
- package/dist/memory/config.js +1 -1
- package/dist/memory/debug-log.js +1 -1
- package/dist/memory/hooks/compaction-hook.js +29 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/observer.js +2 -2
- package/dist/memory/project-observations-store.js +14 -0
- package/dist/memory/tokens.js +1 -1
- package/dist/memory/tools/read-project-observations.js +82 -0
- package/dist/memory/tools/recall-observation.js +2 -2
- package/dist/pi/agent-core/agent-loop.js +501 -0
- package/dist/pi/agent-core/agent.js +401 -0
- package/dist/pi/agent-core/harness/agent-harness.js +899 -0
- package/dist/pi/agent-core/harness/compaction/branch-summarization.js +173 -0
- package/dist/pi/agent-core/harness/compaction/compaction.js +532 -0
- package/dist/pi/agent-core/harness/compaction/utils.js +130 -0
- package/dist/pi/agent-core/harness/env/nodejs.js +485 -0
- package/dist/pi/agent-core/harness/messages.js +101 -0
- package/dist/pi/agent-core/harness/prompt-templates.js +229 -0
- package/dist/pi/agent-core/harness/session/jsonl-repo.js +100 -0
- package/dist/pi/agent-core/harness/session/jsonl-storage.js +230 -0
- package/dist/pi/agent-core/harness/session/memory-repo.js +41 -0
- package/dist/pi/agent-core/harness/session/memory-storage.js +113 -0
- package/dist/pi/agent-core/harness/session/repo-utils.js +38 -0
- package/dist/pi/agent-core/harness/session/session.js +196 -0
- package/dist/pi/agent-core/harness/session/uuid.js +49 -0
- package/dist/pi/agent-core/harness/skills.js +310 -0
- package/dist/pi/agent-core/harness/system-prompt.js +29 -0
- package/dist/pi/agent-core/harness/types.js +93 -0
- package/dist/pi/agent-core/harness/utils/shell-output.js +125 -0
- package/dist/pi/agent-core/harness/utils/truncate.js +289 -0
- package/dist/pi/agent-core/index.js +24 -0
- package/dist/pi/agent-core/node.js +2 -0
- package/dist/pi/agent-core/proxy.js +277 -0
- package/dist/pi/agent-core/types.js +1 -0
- package/dist/pi/ai/api-registry.js +43 -0
- package/dist/pi/ai/cli.js +120 -0
- package/dist/pi/ai/env-api-keys.js +169 -0
- package/dist/pi/ai/image-models.generated.js +441 -0
- package/dist/pi/ai/image-models.js +22 -0
- package/dist/pi/ai/images-api-registry.js +21 -0
- package/dist/pi/ai/images.js +13 -0
- package/dist/pi/ai/index.js +18 -0
- package/dist/pi/ai/models.generated.js +16220 -0
- package/dist/pi/ai/models.js +70 -0
- package/dist/pi/ai/oauth.js +1 -0
- package/dist/pi/ai/providers/anthropic.js +945 -0
- package/dist/pi/ai/providers/faux.js +367 -0
- package/dist/pi/ai/providers/github-copilot-headers.js +28 -0
- package/dist/pi/ai/providers/openai-completions.js +945 -0
- package/dist/pi/ai/providers/openai-prompt-cache.js +9 -0
- package/dist/pi/ai/providers/register-builtins.js +97 -0
- package/dist/pi/ai/providers/simple-options.js +40 -0
- package/dist/pi/ai/providers/transform-messages.js +183 -0
- package/dist/pi/ai/session-resources.js +21 -0
- package/dist/pi/ai/stream.js +26 -0
- package/dist/pi/ai/types.js +1 -0
- package/dist/pi/ai/utils/diagnostics.js +24 -0
- package/dist/pi/ai/utils/event-stream.js +80 -0
- package/dist/pi/ai/utils/hash.js +13 -0
- package/dist/pi/ai/utils/headers.js +7 -0
- package/dist/pi/ai/utils/json-parse.js +112 -0
- package/dist/pi/ai/utils/node-http-proxy.js +96 -0
- package/dist/pi/ai/utils/oauth/anthropic.js +334 -0
- package/dist/pi/ai/utils/oauth/device-code.js +54 -0
- package/dist/pi/ai/utils/oauth/github-copilot.js +270 -0
- package/dist/pi/ai/utils/oauth/index.js +121 -0
- package/dist/pi/ai/utils/oauth/oauth-page.js +104 -0
- package/dist/pi/ai/utils/oauth/openai-codex.js +384 -0
- package/dist/pi/ai/utils/oauth/pkce.js +30 -0
- package/dist/pi/ai/utils/oauth/types.js +1 -0
- package/dist/pi/ai/utils/overflow.js +150 -0
- package/dist/pi/ai/utils/sanitize-unicode.js +25 -0
- package/dist/pi/ai/utils/typebox-helpers.js +20 -0
- package/dist/pi/ai/utils/validation.js +280 -0
- package/dist/pi/coding-agent/bun/cli.js +7 -0
- package/dist/pi/coding-agent/bun/restore-sandbox-env.js +31 -0
- package/dist/pi/coding-agent/cli/args.js +340 -0
- package/dist/pi/coding-agent/cli/file-processor.js +82 -0
- package/dist/pi/coding-agent/cli/initial-message.js +21 -0
- package/dist/pi/coding-agent/cli.js +17 -0
- package/dist/pi/coding-agent/config.js +414 -0
- package/dist/pi/coding-agent/core/agent-session-runtime.js +299 -0
- package/dist/pi/coding-agent/core/agent-session-services.js +117 -0
- package/dist/pi/coding-agent/core/agent-session.js +2498 -0
- package/dist/pi/coding-agent/core/auth-guidance.js +20 -0
- package/dist/pi/coding-agent/core/auth-storage.js +441 -0
- package/dist/pi/coding-agent/core/bash-executor.js +110 -0
- package/dist/pi/coding-agent/core/compaction/branch-summarization.js +242 -0
- package/dist/pi/coding-agent/core/compaction/compaction.js +624 -0
- package/dist/pi/coding-agent/core/compaction/index.js +6 -0
- package/dist/pi/coding-agent/core/compaction/utils.js +152 -0
- package/dist/pi/coding-agent/core/defaults.js +1 -0
- package/dist/pi/coding-agent/core/diagnostics.js +1 -0
- package/dist/pi/coding-agent/core/event-bus.js +24 -0
- package/dist/pi/coding-agent/core/exec.js +74 -0
- package/dist/pi/coding-agent/core/export-html/ansi-to-html.js +248 -0
- package/dist/pi/coding-agent/core/export-html/index.js +225 -0
- package/dist/pi/coding-agent/core/export-html/tool-renderer.js +107 -0
- package/dist/pi/coding-agent/core/extensions/index.js +8 -0
- package/dist/pi/coding-agent/core/extensions/loader.js +485 -0
- package/dist/pi/coding-agent/core/extensions/runner.js +824 -0
- package/dist/pi/coding-agent/core/extensions/types.js +44 -0
- package/dist/pi/coding-agent/core/extensions/wrapper.js +21 -0
- package/dist/pi/coding-agent/core/footer-data-provider.js +309 -0
- package/dist/pi/coding-agent/core/http-dispatcher.js +47 -0
- package/dist/pi/coding-agent/core/index.js +11 -0
- package/dist/pi/coding-agent/core/keybindings.js +294 -0
- package/dist/pi/coding-agent/core/messages.js +122 -0
- package/dist/pi/coding-agent/core/model-registry.js +728 -0
- package/dist/pi/coding-agent/core/model-resolver.js +494 -0
- package/dist/pi/coding-agent/core/output-guard.js +58 -0
- package/dist/pi/coding-agent/core/package-manager.js +2020 -0
- package/dist/pi/coding-agent/core/prompt-templates.js +237 -0
- package/dist/pi/coding-agent/core/provider-display-names.js +32 -0
- package/dist/pi/coding-agent/core/resolve-config-value.js +125 -0
- package/dist/pi/coding-agent/core/resource-loader.js +733 -0
- package/dist/pi/coding-agent/core/sdk.js +282 -0
- package/dist/pi/coding-agent/core/session-cwd.js +37 -0
- package/dist/pi/coding-agent/core/session-manager.js +1146 -0
- package/dist/pi/coding-agent/core/settings-manager.js +794 -0
- package/dist/pi/coding-agent/core/skills.js +386 -0
- package/dist/pi/coding-agent/core/slash-commands.js +24 -0
- package/dist/pi/coding-agent/core/source-info.js +18 -0
- package/dist/pi/coding-agent/core/system-prompt.js +122 -0
- package/dist/pi/coding-agent/core/telemetry.js +8 -0
- package/dist/pi/coding-agent/core/timings.js +30 -0
- package/dist/pi/coding-agent/core/tools/bash.js +341 -0
- package/dist/pi/coding-agent/core/tools/edit-diff.js +344 -0
- package/dist/pi/coding-agent/core/tools/edit.js +324 -0
- package/dist/pi/coding-agent/core/tools/file-mutation-queue.js +36 -0
- package/dist/pi/coding-agent/core/tools/find.js +297 -0
- package/dist/pi/coding-agent/core/tools/grep.js +303 -0
- package/dist/pi/coding-agent/core/tools/index.js +111 -0
- package/dist/pi/coding-agent/core/tools/ls.js +168 -0
- package/dist/pi/coding-agent/core/tools/output-accumulator.js +183 -0
- package/dist/pi/coding-agent/core/tools/path-utils.js +61 -0
- package/dist/pi/coding-agent/core/tools/read.js +288 -0
- package/dist/pi/coding-agent/core/tools/render-utils.js +48 -0
- package/dist/pi/coding-agent/core/tools/tool-definition-wrapper.js +33 -0
- package/dist/pi/coding-agent/core/tools/truncate.js +214 -0
- package/dist/pi/coding-agent/core/tools/write.js +212 -0
- package/dist/pi/coding-agent/index.js +41 -0
- package/dist/pi/coding-agent/main.js +5 -0
- package/dist/pi/coding-agent/migrations.js +280 -0
- package/dist/pi/coding-agent/modes/index.js +7 -0
- package/dist/pi/coding-agent/modes/interactive/components/diff.js +132 -0
- package/dist/pi/coding-agent/modes/interactive/components/keybinding-hints.js +35 -0
- package/dist/pi/coding-agent/modes/interactive/components/visual-truncate.js +32 -0
- package/dist/pi/coding-agent/modes/interactive/interactive-mode.js +3 -0
- package/dist/pi/coding-agent/modes/interactive/theme/theme.js +1023 -0
- package/dist/pi/coding-agent/modes/print-mode.js +130 -0
- package/dist/pi/coding-agent/modes/rpc/jsonl.js +48 -0
- package/dist/pi/coding-agent/modes/rpc/rpc-client.js +409 -0
- package/dist/pi/coding-agent/modes/rpc/rpc-mode.js +600 -0
- package/dist/pi/coding-agent/modes/rpc/rpc-types.js +7 -0
- package/dist/pi/coding-agent/utils/ansi.js +51 -0
- package/dist/pi/coding-agent/utils/changelog.js +86 -0
- package/dist/pi/coding-agent/utils/child-process.js +87 -0
- package/dist/pi/coding-agent/utils/clipboard-image.js +244 -0
- package/dist/pi/coding-agent/utils/clipboard-native.js +13 -0
- package/dist/pi/coding-agent/utils/clipboard.js +116 -0
- package/dist/pi/coding-agent/utils/exif-orientation.js +157 -0
- package/dist/pi/coding-agent/utils/frontmatter.js +25 -0
- package/dist/pi/coding-agent/utils/fs-watch.js +24 -0
- package/dist/pi/coding-agent/utils/git.js +162 -0
- package/dist/pi/coding-agent/utils/html.js +39 -0
- package/dist/pi/coding-agent/utils/image-convert.js +38 -0
- package/dist/pi/coding-agent/utils/image-resize.js +136 -0
- package/dist/pi/coding-agent/utils/mime.js +68 -0
- package/dist/pi/coding-agent/utils/paths.js +91 -0
- package/dist/pi/coding-agent/utils/photon.js +120 -0
- package/dist/pi/coding-agent/utils/pi-user-agent.js +4 -0
- package/dist/pi/coding-agent/utils/shell.js +194 -0
- package/dist/pi/coding-agent/utils/sleep.js +16 -0
- package/dist/pi/coding-agent/utils/syntax-highlight.js +117 -0
- package/dist/pi/coding-agent/utils/tools-manager.js +327 -0
- package/dist/pi/coding-agent/utils/version-check.js +81 -0
- package/dist/pi/coding-agent/utils/windows-self-update.js +76 -0
- package/dist/pi/tui/autocomplete.js +631 -0
- package/dist/pi/tui/components/box.js +103 -0
- package/dist/pi/tui/components/cancellable-loader.js +34 -0
- package/dist/pi/tui/components/editor.js +1915 -0
- package/dist/pi/tui/components/image.js +88 -0
- package/dist/pi/tui/components/input.js +425 -0
- package/dist/pi/tui/components/loader.js +68 -0
- package/dist/pi/tui/components/markdown.js +633 -0
- package/dist/pi/tui/components/select-list.js +158 -0
- package/dist/pi/tui/components/settings-list.js +184 -0
- package/dist/pi/tui/components/spacer.js +22 -0
- package/dist/pi/tui/components/text.js +88 -0
- package/dist/pi/tui/components/truncated-text.js +50 -0
- package/dist/pi/tui/editor-component.js +1 -0
- package/dist/pi/tui/fuzzy.js +109 -0
- package/dist/pi/tui/index.js +31 -0
- package/dist/pi/tui/keybindings.js +173 -0
- package/dist/pi/tui/keys.js +1172 -0
- package/dist/pi/tui/kill-ring.js +43 -0
- package/dist/pi/tui/stdin-buffer.js +360 -0
- package/dist/pi/tui/terminal-image.js +335 -0
- package/dist/pi/tui/terminal.js +324 -0
- package/dist/pi/tui/tui.js +1076 -0
- package/dist/pi/tui/undo-stack.js +24 -0
- package/dist/pi/tui/utils.js +1016 -0
- package/dist/server/pi-bridge.js +156 -6
- package/dist/server/session-stream.js +53 -112
- package/dist/server/storage.js +62 -1
- package/dist/server/title-generator.js +14 -153
- package/package.json +24 -6
package/dist/server/pi-bridge.js
CHANGED
|
@@ -49,12 +49,14 @@
|
|
|
49
49
|
* instance is reused across `prompt()` calls).
|
|
50
50
|
*/
|
|
51
51
|
import { createJiti } from "@mariozechner/jiti";
|
|
52
|
-
import { AuthStorage, createAgentSession, DefaultResourceLoader, ModelRegistry, SessionManager, } from "
|
|
52
|
+
import { AuthStorage, createAgentSession, DefaultResourceLoader, ModelRegistry, SessionManager, } from "../pi/coding-agent/index.js";
|
|
53
53
|
import { randomUUID } from "node:crypto";
|
|
54
|
-
import { existsSync } from "node:fs";
|
|
55
|
-
import { dirname, resolve } from "node:path";
|
|
54
|
+
import { existsSync, statSync } from "node:fs";
|
|
55
|
+
import { dirname, join, resolve } from "node:path";
|
|
56
56
|
import { fileURLToPath } from "node:url";
|
|
57
57
|
import aexolMcpExtension from "../extensions/aexol-mcp.js";
|
|
58
|
+
import subagentExt from "../agent/index.js";
|
|
59
|
+
import designerExtension from "../designer/index.js";
|
|
58
60
|
import observationalMemory from "../memory/index.js";
|
|
59
61
|
import { Runtime } from "../memory/runtime.js";
|
|
60
62
|
import { OBSERVATIONAL_MEMORY_CONTEXT_CUSTOM_TYPE, OBSERVATIONAL_MEMORY_SNAPSHOT_CUSTOM_TYPE, } from "../memory/types.js";
|
|
@@ -73,6 +75,37 @@ import { fetchAllowedModels as defaultFetchAllowedModels, } from "../relay/model
|
|
|
73
75
|
const SPECTRAL_PROXY_ANTHROPIC = "spectral-proxy-anthropic";
|
|
74
76
|
const SPECTRAL_PROXY_OPENAI = "spectral-proxy-openai";
|
|
75
77
|
const SPECTRAL_PROXY_USER_MODEL = "spectral-proxy-user-model";
|
|
78
|
+
/**
|
|
79
|
+
* Walk ancestor directories from `cwd` up to the filesystem root, collecting
|
|
80
|
+
* any existing skill directories at the given relative paths (e.g.
|
|
81
|
+
* `.opencode/skills` or `.aexol/skills`).
|
|
82
|
+
*
|
|
83
|
+
* Directories are returned in order from the deepest ancestor to `cwd` so
|
|
84
|
+
* project-local skills override ancestor-level ones when there are name
|
|
85
|
+
* collisions (pi's skill loader keeps the first found).
|
|
86
|
+
*/
|
|
87
|
+
function collectAncestorSkillDirs(cwd, relativePaths) {
|
|
88
|
+
const found = [];
|
|
89
|
+
let dir = resolve(cwd);
|
|
90
|
+
while (true) {
|
|
91
|
+
for (const rel of relativePaths) {
|
|
92
|
+
const candidate = join(dir, rel);
|
|
93
|
+
try {
|
|
94
|
+
if (existsSync(candidate) && statSync(candidate).isDirectory()) {
|
|
95
|
+
found.push(candidate);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// skip permission errors etc.
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const parent = dirname(dir);
|
|
103
|
+
if (parent === dir)
|
|
104
|
+
break;
|
|
105
|
+
dir = parent;
|
|
106
|
+
}
|
|
107
|
+
return found;
|
|
108
|
+
}
|
|
76
109
|
/**
|
|
77
110
|
* Concatenate text from an `AssistantMessage.content` array. Returns the
|
|
78
111
|
* empty string when no text blocks are present (tool-only turns) or when
|
|
@@ -356,7 +389,7 @@ export class PiBridge {
|
|
|
356
389
|
async start() {
|
|
357
390
|
if (this.disposed)
|
|
358
391
|
throw new Error("PiBridge already disposed");
|
|
359
|
-
const extensionFactories = [aexolMcpExtension, async (pi) => { observationalMemory(pi); }];
|
|
392
|
+
const extensionFactories = [aexolMcpExtension, async (pi) => { subagentExt(pi); }, async (pi) => { designerExtension(pi); }, async (pi) => { observationalMemory(pi); }];
|
|
360
393
|
// Load pi-mcp-adapter via jiti so tsc never crawls its .ts files in
|
|
361
394
|
// node_modules. The static `import` was causing tsc to type-check
|
|
362
395
|
// pi-mcp-adapter's source and fail the build on its type errors.
|
|
@@ -380,15 +413,22 @@ export class PiBridge {
|
|
|
380
413
|
// ResourceLoader with extensions wired in via factories.
|
|
381
414
|
// Each factory's signature `(pi: ExtensionAPI) => Promise<void>` matches
|
|
382
415
|
// the ExtensionFactory type exactly, so we can pass them directly.
|
|
416
|
+
//
|
|
417
|
+
// Skill discovery: pi's defaults scan ~/.pi/agent/skills/ (user),
|
|
418
|
+
// .pi/skills/ (project via CONFIG_DIR_NAME), and .agents/skills/
|
|
419
|
+
// (ancestor-walked). We additionally walk ancestors for
|
|
420
|
+
// .opencode/skills and .aexol/skills so OpenCode/Codex/Aexol skills
|
|
421
|
+
// work out of the box.
|
|
422
|
+
const extraSkillPaths = collectAncestorSkillDirs(this.opts.cwd, [".opencode/skills", ".aexol/skills"]);
|
|
383
423
|
const resourceLoader = new DefaultResourceLoader({
|
|
384
424
|
cwd: this.opts.cwd,
|
|
385
425
|
agentDir: this.opts.agentDir ?? `${process.env.HOME ?? ""}/.pi/agent`,
|
|
386
426
|
extensionFactories,
|
|
387
|
-
// Skip on-disk extension/skill discovery so the server is self-contained.
|
|
388
427
|
noExtensions: false,
|
|
389
|
-
noSkills:
|
|
428
|
+
noSkills: false,
|
|
390
429
|
noPromptTemplates: true,
|
|
391
430
|
noThemes: true,
|
|
431
|
+
additionalSkillPaths: extraSkillPaths,
|
|
392
432
|
});
|
|
393
433
|
await resourceLoader.reload();
|
|
394
434
|
// In-memory session: SQLite is our source of truth.
|
|
@@ -1029,6 +1069,27 @@ export class PiBridge {
|
|
|
1029
1069
|
return;
|
|
1030
1070
|
}
|
|
1031
1071
|
case "tool_execution_start": {
|
|
1072
|
+
// Emit subagent_start for subagent tool invocations (Option B frontend panels).
|
|
1073
|
+
if (ev.toolName === "subagent") {
|
|
1074
|
+
const args = ev.args;
|
|
1075
|
+
const mode = args?.chain?.length > 0 ? "chain"
|
|
1076
|
+
: args?.tasks?.length > 0 ? "parallel"
|
|
1077
|
+
: "single";
|
|
1078
|
+
const se = {
|
|
1079
|
+
type: "subagent_start",
|
|
1080
|
+
toolCallId: ev.toolCallId,
|
|
1081
|
+
mode,
|
|
1082
|
+
agent: typeof args?.agent === "string" ? args.agent : undefined,
|
|
1083
|
+
task: typeof args?.task === "string" ? args.task : undefined,
|
|
1084
|
+
taskCount: mode === "chain"
|
|
1085
|
+
? args?.chain?.length
|
|
1086
|
+
: mode === "parallel"
|
|
1087
|
+
? args?.tasks?.length
|
|
1088
|
+
: undefined,
|
|
1089
|
+
totalSteps: mode === "chain" ? args?.chain?.length : undefined,
|
|
1090
|
+
};
|
|
1091
|
+
this.emitAndBuffer(se);
|
|
1092
|
+
}
|
|
1032
1093
|
this.emitAndBuffer({
|
|
1033
1094
|
type: "tool_call",
|
|
1034
1095
|
messageId: this.pending?.messageId ?? "",
|
|
@@ -1038,7 +1099,96 @@ export class PiBridge {
|
|
|
1038
1099
|
});
|
|
1039
1100
|
return;
|
|
1040
1101
|
}
|
|
1102
|
+
case "tool_execution_update": {
|
|
1103
|
+
// Emit subagent_progress for subagent tool updates.
|
|
1104
|
+
if (ev.toolName === "subagent") {
|
|
1105
|
+
const partialResult = ev.partialResult;
|
|
1106
|
+
const details = partialResult?.details;
|
|
1107
|
+
if (details?.results) {
|
|
1108
|
+
const mode = (details.mode ?? "single");
|
|
1109
|
+
const total = details.results.length;
|
|
1110
|
+
const done = details.results.filter(r => r.exitCode !== undefined && r.exitCode !== -1).length;
|
|
1111
|
+
const running = total - done;
|
|
1112
|
+
const currentAgent = details.results.find(r => r.exitCode === -1 || r.exitCode === undefined)?.agent;
|
|
1113
|
+
const se = {
|
|
1114
|
+
type: "subagent_progress",
|
|
1115
|
+
toolCallId: ev.toolCallId,
|
|
1116
|
+
mode,
|
|
1117
|
+
completedCount: done,
|
|
1118
|
+
totalCount: total,
|
|
1119
|
+
currentStep: mode === "chain" ? details.results[details.results.length - 1]?.step : undefined,
|
|
1120
|
+
currentAgent,
|
|
1121
|
+
message: mode === "parallel"
|
|
1122
|
+
? `Parallel: ${done}/${total} done, ${running} running`
|
|
1123
|
+
: mode === "chain"
|
|
1124
|
+
? `Chain: step ${details.results.length}/${total}`
|
|
1125
|
+
: `Running ${currentAgent ?? "subagent"}...`,
|
|
1126
|
+
};
|
|
1127
|
+
try {
|
|
1128
|
+
this.opts.emit(se);
|
|
1129
|
+
}
|
|
1130
|
+
catch { /* best-effort */ }
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
return;
|
|
1134
|
+
}
|
|
1041
1135
|
case "tool_execution_end": {
|
|
1136
|
+
// Emit subagent_end for subagent tool completions.
|
|
1137
|
+
if (ev.toolName === "subagent") {
|
|
1138
|
+
const result = ev.result;
|
|
1139
|
+
const details = result?.details;
|
|
1140
|
+
if (details?.results && details.results.length > 0) {
|
|
1141
|
+
const mode = (details.mode ?? "single");
|
|
1142
|
+
const getOutput = (msgs) => {
|
|
1143
|
+
if (!msgs)
|
|
1144
|
+
return "(no output)";
|
|
1145
|
+
for (let i = msgs.length - 1; i >= 0; i--) {
|
|
1146
|
+
if (msgs[i].role === "assistant") {
|
|
1147
|
+
for (const part of msgs[i].content) {
|
|
1148
|
+
if (part.type === "text" && part.text)
|
|
1149
|
+
return part.text;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
return "(no output)";
|
|
1154
|
+
};
|
|
1155
|
+
const results = details.results.map(r => ({
|
|
1156
|
+
agent: r.agent,
|
|
1157
|
+
agentSource: r.agentSource ?? "unknown",
|
|
1158
|
+
task: r.task,
|
|
1159
|
+
exitCode: r.exitCode,
|
|
1160
|
+
output: getOutput(r.messages),
|
|
1161
|
+
model: r.model,
|
|
1162
|
+
errorMessage: r.errorMessage,
|
|
1163
|
+
stopReason: r.stopReason,
|
|
1164
|
+
step: r.step,
|
|
1165
|
+
usage: {
|
|
1166
|
+
inputTokens: r.usage?.input ?? 0,
|
|
1167
|
+
outputTokens: r.usage?.output ?? 0,
|
|
1168
|
+
cacheReadTokens: r.usage?.cacheRead ?? 0,
|
|
1169
|
+
cacheWriteTokens: r.usage?.cacheWrite ?? 0,
|
|
1170
|
+
cost: r.usage?.cost ?? 0,
|
|
1171
|
+
turns: r.usage?.turns ?? 0,
|
|
1172
|
+
},
|
|
1173
|
+
}));
|
|
1174
|
+
const totalUsage = results.reduce((acc, r) => ({
|
|
1175
|
+
inputTokens: acc.inputTokens + r.usage.inputTokens,
|
|
1176
|
+
outputTokens: acc.outputTokens + r.usage.outputTokens,
|
|
1177
|
+
cacheReadTokens: acc.cacheReadTokens + r.usage.cacheReadTokens,
|
|
1178
|
+
cacheWriteTokens: acc.cacheWriteTokens + r.usage.cacheWriteTokens,
|
|
1179
|
+
cost: acc.cost + r.usage.cost,
|
|
1180
|
+
turns: acc.turns + r.usage.turns,
|
|
1181
|
+
}), { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0, cost: 0, turns: 0 });
|
|
1182
|
+
const se = {
|
|
1183
|
+
type: "subagent_end",
|
|
1184
|
+
toolCallId: ev.toolCallId,
|
|
1185
|
+
mode,
|
|
1186
|
+
results,
|
|
1187
|
+
totalUsage,
|
|
1188
|
+
};
|
|
1189
|
+
this.emitAndBuffer(se);
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1042
1192
|
this.emitAndBuffer({
|
|
1043
1193
|
type: "tool_result",
|
|
1044
1194
|
messageId: this.pending?.messageId ?? "",
|
|
@@ -41,9 +41,9 @@ import { PiBridge } from "./pi-bridge.js";
|
|
|
41
41
|
import { getMemoryState, isSourceEntry, rawTokensSinceLastBound, rawTokensSinceLastCompaction, } from "../memory/branch.js";
|
|
42
42
|
import { observationPoolTokens, renderSummary } from "../memory/compaction.js";
|
|
43
43
|
import { loadConfig } from "../memory/config.js";
|
|
44
|
+
import { setProjectObsStore } from "../memory/project-observations-store.js";
|
|
44
45
|
import { estimateStringTokens } from "../memory/tokens.js";
|
|
45
46
|
import { reflectionContent, reflectionId } from "../memory/types.js";
|
|
46
|
-
import { generateSessionTitle, isDefaultTitle, } from "./title-generator.js";
|
|
47
47
|
const DEFAULT_BRIDGE_FACTORY = (args) => new PiBridge(args);
|
|
48
48
|
/** Safety limit for autonomous loop iterations per session. */
|
|
49
49
|
const MAX_LOOP_ITERATIONS = 100;
|
|
@@ -233,17 +233,7 @@ export class SessionStreamManager {
|
|
|
233
233
|
machineJwt;
|
|
234
234
|
bridgeFactory;
|
|
235
235
|
agentDir;
|
|
236
|
-
titleLlmCall;
|
|
237
|
-
disableAutoTitle;
|
|
238
|
-
publishMetaEvent;
|
|
239
236
|
streams = new Map();
|
|
240
|
-
/**
|
|
241
|
-
* Sessions for which we've already attempted (or queued) auto-title
|
|
242
|
-
* generation in this server process. Per-process is intentional: a server
|
|
243
|
-
* restart resets the set, but `isDefaultTitle()` still gates the work so a
|
|
244
|
-
* since-renamed session is never overwritten.
|
|
245
|
-
*/
|
|
246
|
-
titleGenerationAttempted = new Set();
|
|
247
237
|
disposed = false;
|
|
248
238
|
constructor(opts) {
|
|
249
239
|
this.store = opts.store;
|
|
@@ -252,9 +242,13 @@ export class SessionStreamManager {
|
|
|
252
242
|
this.machineJwt = opts.machineJwt;
|
|
253
243
|
this.bridgeFactory = opts.bridgeFactory ?? DEFAULT_BRIDGE_FACTORY;
|
|
254
244
|
this.agentDir = opts.agentDir;
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
245
|
+
// Wire the project observations store singleton so the memory extension's
|
|
246
|
+
// read_project_observations tool can query cross-session observations.
|
|
247
|
+
setProjectObsStore({
|
|
248
|
+
insertProjectObservations: (pid, sid, obs, ts) => this.store.insertProjectObservations(pid, sid, obs, ts),
|
|
249
|
+
searchProjectObservations: (pid, q, limit) => this.store.searchProjectObservations(pid, q, limit),
|
|
250
|
+
getProjectByCwd: (cwd) => this.store.getProjectByCwd(cwd),
|
|
251
|
+
});
|
|
258
252
|
}
|
|
259
253
|
/**
|
|
260
254
|
* Attach a subscriber to a session. Lazily creates the underlying pi
|
|
@@ -1130,8 +1124,30 @@ export class SessionStreamManager {
|
|
|
1130
1124
|
}
|
|
1131
1125
|
// Track compaction lifecycle so prompt() can block new messages while
|
|
1132
1126
|
// compaction is running.
|
|
1127
|
+
//
|
|
1128
|
+
// Persist synthetic system messages so historic session replay (reconnect,
|
|
1129
|
+
// page refresh) shows compaction events in the message timeline. These are
|
|
1130
|
+
// broadcast live to connected subscribers AND persisted, so both live and
|
|
1131
|
+
// historic sessions see them.
|
|
1133
1132
|
if (event.type === "compaction_start") {
|
|
1134
1133
|
stream.compacting = true;
|
|
1134
|
+
const reasonLabel = event.reason === "manual"
|
|
1135
|
+
? "Manual compaction"
|
|
1136
|
+
: event.reason === "overflow"
|
|
1137
|
+
? "Context overflow"
|
|
1138
|
+
: "Context threshold";
|
|
1139
|
+
const sysMsg = `${reasonLabel} — compacting conversation context…`;
|
|
1140
|
+
try {
|
|
1141
|
+
this.store.appendMessage(stream.sessionId, {
|
|
1142
|
+
role: "system",
|
|
1143
|
+
content: sysMsg,
|
|
1144
|
+
eventsJsonl: "",
|
|
1145
|
+
createdAt: Date.now(),
|
|
1146
|
+
});
|
|
1147
|
+
}
|
|
1148
|
+
catch {
|
|
1149
|
+
// best-effort; never block the stream on persistence
|
|
1150
|
+
}
|
|
1135
1151
|
}
|
|
1136
1152
|
if (event.type === "compaction_end") {
|
|
1137
1153
|
stream.compacting = false;
|
|
@@ -1139,6 +1155,25 @@ export class SessionStreamManager {
|
|
|
1139
1155
|
prunePersistedHistoryAfterCompaction(this.store, stream.sessionId, stream.bridge);
|
|
1140
1156
|
}
|
|
1141
1157
|
persistObservationalMemorySnapshot(this.store, stream.sessionId, stream.bridge);
|
|
1158
|
+
const tokensMsg = typeof event.tokensBefore === "number"
|
|
1159
|
+
? ` (from ~${event.tokensBefore.toLocaleString()} tokens)`
|
|
1160
|
+
: "";
|
|
1161
|
+
const sysMsg = event.aborted
|
|
1162
|
+
? "Compaction aborted."
|
|
1163
|
+
: event.summary
|
|
1164
|
+
? `Compaction complete${tokensMsg}. Summary: ${event.summary}`
|
|
1165
|
+
: `Compaction complete${tokensMsg}.`;
|
|
1166
|
+
try {
|
|
1167
|
+
this.store.appendMessage(stream.sessionId, {
|
|
1168
|
+
role: "system",
|
|
1169
|
+
content: sysMsg,
|
|
1170
|
+
eventsJsonl: "",
|
|
1171
|
+
createdAt: Date.now(),
|
|
1172
|
+
});
|
|
1173
|
+
}
|
|
1174
|
+
catch {
|
|
1175
|
+
// best-effort
|
|
1176
|
+
}
|
|
1142
1177
|
}
|
|
1143
1178
|
this.broadcast(stream, event);
|
|
1144
1179
|
if (event.type === "agent_end") {
|
|
@@ -1151,11 +1186,6 @@ export class SessionStreamManager {
|
|
|
1151
1186
|
stream.lastFlushedEventCount = 0;
|
|
1152
1187
|
const finishedTurn = stream.currentTurn;
|
|
1153
1188
|
stream.currentTurn = null;
|
|
1154
|
-
// Fire-and-forget auto-title generation. Runs only once per session
|
|
1155
|
-
// per server lifetime, only when the session is still wearing its
|
|
1156
|
-
// default title, and never blocks the user's stream (the user's
|
|
1157
|
-
// turn is already complete by the time this runs).
|
|
1158
|
-
this.maybeGenerateTitle(stream, finishedTurn);
|
|
1159
1189
|
// Autonomous iterative loop (Ralph Wiggum pattern).
|
|
1160
1190
|
// When loopActive is set, check for completion marker, then re-send
|
|
1161
1191
|
// the ORIGINAL prompt so the agent sees its prior changes and
|
|
@@ -1259,98 +1289,6 @@ export class SessionStreamManager {
|
|
|
1259
1289
|
console.error(`[spectral] error: batch-persist flush failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1260
1290
|
}
|
|
1261
1291
|
}
|
|
1262
|
-
/**
|
|
1263
|
-
* Auto-title the session if it's still wearing the default title and we
|
|
1264
|
-
* haven't already attempted generation in this process. Fire-and-forget
|
|
1265
|
-
* (errors are caught, logged, and swallowed) — the user's stream finished
|
|
1266
|
-
* before this runs, so blocking would only delay the broadcast.
|
|
1267
|
-
*/
|
|
1268
|
-
maybeGenerateTitle(stream, finishedTurn) {
|
|
1269
|
-
if (this.disableAutoTitle)
|
|
1270
|
-
return;
|
|
1271
|
-
if (this.titleGenerationAttempted.has(stream.sessionId))
|
|
1272
|
-
return;
|
|
1273
|
-
// Check the persisted title now (manual rename takes precedence).
|
|
1274
|
-
const detail = this.store.getSession(stream.sessionId);
|
|
1275
|
-
if (!detail || !isDefaultTitle(detail.title))
|
|
1276
|
-
return;
|
|
1277
|
-
// Find the first user message + the assistant text from the just-finished
|
|
1278
|
-
// turn. We deliberately read user content from SQLite (authoritative)
|
|
1279
|
-
// and assistant content from the in-memory turn buffer (cheap, and
|
|
1280
|
-
// matches what the user just saw).
|
|
1281
|
-
const firstUser = detail.messages.find((m) => m.role === "user");
|
|
1282
|
-
if (!firstUser || !firstUser.content.trim())
|
|
1283
|
-
return;
|
|
1284
|
-
let assistantText = finishedTurn?.assistantText ?? "";
|
|
1285
|
-
if (!assistantText) {
|
|
1286
|
-
// Fallback: pull the most recent assistant message from SQLite. This
|
|
1287
|
-
// can happen if `agent_end` fires for a turn whose buffer was cleared
|
|
1288
|
-
// by an intervening error event, or when this code path is reached
|
|
1289
|
-
// via a synthetic test event.
|
|
1290
|
-
const lastAssistant = [...detail.messages]
|
|
1291
|
-
.reverse()
|
|
1292
|
-
.find((m) => m.role === "assistant");
|
|
1293
|
-
assistantText = lastAssistant?.content ?? "";
|
|
1294
|
-
}
|
|
1295
|
-
// Mark BEFORE awaiting so a second `agent_end` arriving while we're
|
|
1296
|
-
// generating doesn't double-fire. Even if generation throws, we leave
|
|
1297
|
-
// the entry in place — one-shot semantics, no retries.
|
|
1298
|
-
this.titleGenerationAttempted.add(stream.sessionId);
|
|
1299
|
-
void this.runTitleGeneration(stream, firstUser.content, assistantText);
|
|
1300
|
-
}
|
|
1301
|
-
async runTitleGeneration(stream, firstUserMessage, firstAssistantMessage) {
|
|
1302
|
-
try {
|
|
1303
|
-
const title = await generateSessionTitle(firstUserMessage, firstAssistantMessage, {
|
|
1304
|
-
cwd: stream.cwd,
|
|
1305
|
-
agentDir: this.agentDir,
|
|
1306
|
-
llmCall: this.titleLlmCall,
|
|
1307
|
-
});
|
|
1308
|
-
if (this.disposed)
|
|
1309
|
-
return;
|
|
1310
|
-
if (!title)
|
|
1311
|
-
return;
|
|
1312
|
-
// Re-check the title hasn't been changed underneath us while we were
|
|
1313
|
-
// waiting on the LLM (e.g. user manually renamed mid-generation).
|
|
1314
|
-
const current = this.store.getSession(stream.sessionId);
|
|
1315
|
-
if (!current || !isDefaultTitle(current.title))
|
|
1316
|
-
return;
|
|
1317
|
-
const updated = this.store.renameSession(stream.sessionId, title);
|
|
1318
|
-
if (!updated)
|
|
1319
|
-
return;
|
|
1320
|
-
// Broadcast to every subscriber of this session so all open tabs
|
|
1321
|
-
// update their sidebar in real time. The wire event is independent
|
|
1322
|
-
// of the in-flight turn lifecycle, so it's safe to fire post-agent_end.
|
|
1323
|
-
this.broadcast(stream, {
|
|
1324
|
-
type: "session_renamed",
|
|
1325
|
-
sessionId: stream.sessionId,
|
|
1326
|
-
title: updated.title,
|
|
1327
|
-
});
|
|
1328
|
-
// Cross-tab fan-out hint: tabs that don't have THIS session open
|
|
1329
|
-
// (and so don't have a per-session ws subscription) still want to
|
|
1330
|
-
// refresh their sidebar to show the new title. Best-effort; a
|
|
1331
|
-
// failed publish never undoes the rename.
|
|
1332
|
-
if (this.publishMetaEvent) {
|
|
1333
|
-
try {
|
|
1334
|
-
this.publishMetaEvent({
|
|
1335
|
-
type: "session_renamed",
|
|
1336
|
-
projectId: updated.projectId,
|
|
1337
|
-
sessionId: stream.sessionId,
|
|
1338
|
-
});
|
|
1339
|
-
}
|
|
1340
|
-
catch (err) {
|
|
1341
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
1342
|
-
console.warn(`[spectral] warn: meta publish for auto-title failed: ${msg}`);
|
|
1343
|
-
}
|
|
1344
|
-
}
|
|
1345
|
-
}
|
|
1346
|
-
catch (err) {
|
|
1347
|
-
// Defensive: generateSessionTitle already swallows LLM errors. This
|
|
1348
|
-
// catches any unexpected throw from rename/broadcast so the manager
|
|
1349
|
-
// is never destabilized by a background title task.
|
|
1350
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
1351
|
-
console.warn(`[spectral] warn: auto-title pipeline failed: ${msg}`);
|
|
1352
|
-
}
|
|
1353
|
-
}
|
|
1354
1292
|
broadcast(stream, event) {
|
|
1355
1293
|
const dead = [];
|
|
1356
1294
|
for (const sub of stream.subscribers) {
|
|
@@ -1378,7 +1316,10 @@ function isReplayable(event) {
|
|
|
1378
1316
|
event.type === "tool_result" ||
|
|
1379
1317
|
event.type === "message_end" ||
|
|
1380
1318
|
event.type === "token_usage" ||
|
|
1381
|
-
event.type === "error"
|
|
1319
|
+
event.type === "error" ||
|
|
1320
|
+
event.type === "subagent_start" ||
|
|
1321
|
+
event.type === "subagent_progress" ||
|
|
1322
|
+
event.type === "subagent_end");
|
|
1382
1323
|
}
|
|
1383
1324
|
function snapshotTurn(turn) {
|
|
1384
1325
|
// Defensive copy of the events array so the snapshot can't be mutated by
|
package/dist/server/storage.js
CHANGED
|
@@ -78,6 +78,17 @@ CREATE TABLE IF NOT EXISTS session_memory_snapshots (
|
|
|
78
78
|
covered_source_count INTEGER NOT NULL,
|
|
79
79
|
updated_at INTEGER NOT NULL
|
|
80
80
|
);
|
|
81
|
+
|
|
82
|
+
CREATE TABLE IF NOT EXISTS project_observations (
|
|
83
|
+
id TEXT PRIMARY KEY,
|
|
84
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
85
|
+
session_id TEXT NOT NULL,
|
|
86
|
+
content TEXT NOT NULL,
|
|
87
|
+
relevance TEXT NOT NULL CHECK (relevance IN ('low','medium','high','critical')),
|
|
88
|
+
created_at INTEGER NOT NULL
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
CREATE INDEX IF NOT EXISTS idx_project_obs_project ON project_observations(project_id, created_at DESC);
|
|
81
92
|
`;
|
|
82
93
|
/**
|
|
83
94
|
* Synchronous binding-file reader for a project at the given filesystem path.
|
|
@@ -108,7 +119,7 @@ function applyBindingFields(project) {
|
|
|
108
119
|
};
|
|
109
120
|
}
|
|
110
121
|
/** Tables we own — used by the migration drop step. */
|
|
111
|
-
const KNOWN_TABLES = ["session_memory_snapshots", "messages", "sessions", "projects"];
|
|
122
|
+
const KNOWN_TABLES = ["project_observations", "session_memory_snapshots", "messages", "sessions", "projects"];
|
|
112
123
|
/** Best-effort parse of the `images_json` column into `ImageAttachment[]`. */
|
|
113
124
|
function parseImagesJson(raw) {
|
|
114
125
|
if (!raw || raw === "")
|
|
@@ -169,6 +180,10 @@ export class SessionStore {
|
|
|
169
180
|
// Fork & Compact: flag + per-session source tracking.
|
|
170
181
|
stmtSetForkCompactSource;
|
|
171
182
|
stmtGetForkCompactSource;
|
|
183
|
+
// Project observations: cross-session durable memory.
|
|
184
|
+
stmtInsertProjectObs;
|
|
185
|
+
stmtSearchProjectObs;
|
|
186
|
+
stmtGetProjectByCwd;
|
|
172
187
|
constructor(path) {
|
|
173
188
|
this.path = path;
|
|
174
189
|
// Make sure the parent directory exists. mkdirSync with recursive is a
|
|
@@ -307,6 +322,14 @@ export class SessionStore {
|
|
|
307
322
|
this.stmtSetSessionModel = this.db.prepare(`UPDATE sessions SET model_id = ? WHERE id = ?`);
|
|
308
323
|
this.stmtSetForkCompactSource = this.db.prepare(`UPDATE sessions SET fork_compact_source_id = ? WHERE id = ?`);
|
|
309
324
|
this.stmtGetForkCompactSource = this.db.prepare(`SELECT fork_compact_source_id FROM sessions WHERE id = ?`);
|
|
325
|
+
this.stmtInsertProjectObs = this.db.prepare(`INSERT OR REPLACE INTO project_observations (id, project_id, session_id, content, relevance, created_at)
|
|
326
|
+
VALUES (?, ?, ?, ?, ?, ?)`);
|
|
327
|
+
this.stmtSearchProjectObs = this.db.prepare(`SELECT id, project_id, session_id, content, relevance, created_at
|
|
328
|
+
FROM project_observations
|
|
329
|
+
WHERE project_id = ? AND content LIKE ?
|
|
330
|
+
ORDER BY created_at DESC
|
|
331
|
+
LIMIT 20`);
|
|
332
|
+
this.stmtGetProjectByCwd = this.db.prepare(`SELECT id FROM projects WHERE path = ? LIMIT 1`);
|
|
310
333
|
}
|
|
311
334
|
/** Smoke check: returns the names of the tables in the DB. */
|
|
312
335
|
listTables() {
|
|
@@ -653,6 +676,44 @@ export class SessionStore {
|
|
|
653
676
|
clearForkCompactSource(sessionId) {
|
|
654
677
|
this.stmtSetForkCompactSource.run(null, sessionId);
|
|
655
678
|
}
|
|
679
|
+
// ----------------------------------------------------------------------
|
|
680
|
+
// Project observations (cross-session durable memory)
|
|
681
|
+
// ----------------------------------------------------------------------
|
|
682
|
+
/**
|
|
683
|
+
* Insert multiple project observations in a single transaction.
|
|
684
|
+
* Uses INSERT OR REPLACE so re-running after the same compaction is idempotent.
|
|
685
|
+
*/
|
|
686
|
+
insertProjectObservations(projectId, sessionId, observations, createdAt) {
|
|
687
|
+
if (observations.length === 0)
|
|
688
|
+
return;
|
|
689
|
+
const tx = this.db.transaction(() => {
|
|
690
|
+
for (const obs of observations) {
|
|
691
|
+
this.stmtInsertProjectObs.run(obs.id, projectId, sessionId, obs.content, obs.relevance, createdAt);
|
|
692
|
+
}
|
|
693
|
+
});
|
|
694
|
+
tx();
|
|
695
|
+
}
|
|
696
|
+
/**
|
|
697
|
+
* Search project observations by substring match. Returns up to 20 most recent.
|
|
698
|
+
*/
|
|
699
|
+
searchProjectObservations(projectId, query, limit = 20) {
|
|
700
|
+
const pattern = `%${query}%`;
|
|
701
|
+
const rows = this.stmtSearchProjectObs.all(projectId, pattern);
|
|
702
|
+
return rows.slice(0, limit).map((r) => ({
|
|
703
|
+
content: r.content,
|
|
704
|
+
relevance: r.relevance,
|
|
705
|
+
createdAt: r.created_at,
|
|
706
|
+
sessionId: r.session_id,
|
|
707
|
+
}));
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
* Look up a project by its absolute filesystem path.
|
|
711
|
+
* Returns null when no project has been registered for the given path.
|
|
712
|
+
*/
|
|
713
|
+
getProjectByCwd(cwd) {
|
|
714
|
+
const row = this.stmtGetProjectByCwd.get(cwd);
|
|
715
|
+
return row?.id ?? null;
|
|
716
|
+
}
|
|
656
717
|
close() {
|
|
657
718
|
if (this.closed)
|
|
658
719
|
return;
|