Releases: portel-dev/photon
Releases · portel-dev/photon
v1.25.0
v1.24.0
Features
- beam: human-in-the-loop sampling — Beam answers sampling/createMessage (7f7a3dd)
- beam: SDK-transport-only MCP client prototype (not yet wired) (e34ef2f)
- claim: scoped remote access for MCP sessions via short-lived codes (6300a87)
- cli: remove timeouts, heartbeat contract, Ctrl+C handling (95f470d)
- deploy/cf: auto-bridge cf CLI token and bump wrangler pin to v4 (84e5171)
- runtime: SQLite-backed memory backend (4fb70e5)
- runtime: wire this.sample / this.confirm / this.elicit end-to-end (44016ab)
- scheduler: catch up missed fires after daemon downtime (9a32bff)
Bug Fixes
- address codex adversarial review findings (4 P1 + 4 P2) (ea2a87c)
- address codex review P1s + P2s on claim + sampling + SDK client (470e610)
- beam: bump MCP method-call timeout from 60s to 5 min (b3cc61a)
- beam: mirror theme tokens on sampling modal so dark/light tracks beam-app (667128c)
- daemon: boot-time scanner loads schedule.create() files (23b1c1a)
- deploy/cf: replace hung SSE session transport with stateless MCP Streamable HTTP (809373a)
- loader: always-inject this.memory and this.instanceMeta on plain classes (f1f74d4)
- loader: inject schedule-unschedule hook so cancel evicts ghosts (eece871)
- runtime: serialize concurrent method calls per photon instance (2ebfcc0)
- scheduler: fire cron jobs without requiring a warm photon (d74bfc0)
- serv: tools/call echoes client-supplied _meta.progressToken (dc45b9d)
v1.23.1
v1.23.0
1.23.0 (2026-04-21)
Features
- a2ui: action round-trip — button name dispatches photon method (f3f0d33)
- a2ui: Beam renderer + end-to-end tests + docs (fc64192)
- audit: SQLite-backed audit store with runtime-agnostic loader (ee8b653)
- beam: daemon panel UI — four tables, actions, history drawer (7a0bbc7), closes #16
- beam: HTTP wrappers around the daemon ps/schedule RPCs (97d28e4)
- beam: instance label + JSDoc help text in Settings tabs (9cc3719)
- beam: split Settings view into Setup + Configuration sub-tabs (7e6a489)
- cli: add 'photon new' as a top-level shortcut for 'photon maker new' (e66cfb7)
- cli: announceContext adoption across PHOTON_DIR-sensitive commands (78cf93a)
- cli: announceContext helper + --verbose/--json context envelope (a178d42)
- daemon: brand registry-key types so bare-string lookups don't compile (7f5ac35)
- daemon: brand scheduledJobs/jobTimers keys + route disable through unscheduleJob (99476fa)
- daemon: brand the remaining photon-scoped maps + patch two latent multi-base bugs (78e991e)
- daemon: discover @scheduled and @webhook tags at boot, lazy-load on fire (c6206d3)
- daemon: live watcher for @scheduled / @webhook tag edits (2725f3c)
- daemon: SQLite backend for execution history with indexed queries (c10ae80)
- doctor: tool-sprawl and secret-named-param lints (abc331d), closes #4 #5 #3
- errors: link common errors to TROUBLESHOOTING.md (be914fa), closes #photon-not-found #mcp-not-found-in-marketplace #photon-not-found #missing-environment-variables
- loader: inject this.shell with cwd pinned to the photon's folder (4d4b791)
- loader: register stat-gate reloader for CLI-direct dispatch (0db9177), closes #17
- maker: scaffold new photons into CWD by default, --global opts into ~/.photon (6b32479)
- mcp: add 'photon mcp install' to register a photon in Claude Desktop (366133e)
- new: add --for and --force flags to scaffold command (848bcd8)
- ps:
photon pscommand for observing + controlling scheduled work (157e33f) - schedules: cross-base startup scan + legacy IPC sweep (3c44a88)
- schedules: persist execution history for scheduled jobs (1dbdf82)
- schedules: two-step model — declare via @scheduled, enroll via active list (45da5c1)
- security: default 60/min rate limits on webhook + /mcp transports (b7766b6)
- serv: HTTP adapter mounts the OAuth 2.1 endpoints onto Node's http server (1d79b00)
- serv: OAuth 2.1 authorization server endpoints with CIMD + DCR (f97b473)
- serv: Serv-class factory + OTel metrics + AS docs (8f3cefc)
- serv: SQLite elicitation + grant stores for upstream OAuth persistence (4a4c001)
- serv: token revocation/introspection, OIDC id_token, RS256/ES256, RFC 8693 token exchange, SQLite persistent stores (7e17ac0)
- update,upgrade: add --dry-run to preview changes before installing (2d3970a)
- version: dev-build marker via semver build-metadata (+sha.) (3c0e110)
- webhook: CIDR source allowlist for daemon webhook server (26f568e)
Bug Fixes
- a2ui: tighter stream detection + card shape guard + RFC 6901 decode (cd23d13)
- add: drop spurious fuzzy matches that echo the query back (d525640)
- cli-runner: cast hint to string for 'a2ui' comparison (8e3d26d)
- cli,daemon: bundled-photon guard runs first + legacy-key sweep on disable (ddb1423)
- cli,server: photon ps --base flag + revert hot-reload heuristic (7f0b94a)
- cli: always persist PHOTON_DIR in mcp install when workspace != ~/.photon (0fd0ec3)
- cli: exclude lifecycle hooks from photon cli method listing (6a8adb7)
- cli: preserve JSDoc paragraph breaks in photon cli help output (a70f759)
- cli: show subcommands in group --help (maker, host, marketplace) (e28f81e)
- context-store: honor PHOTON_DIR for instance state, env, state log paths (7df9fcd)
- context: require .marketplace/ for PHOTON_DIR detection (with one-release transition) (0eac2a0)
- daemon,ag-ui: hot-rescan and AG-UI adapter both normalize with boot discovery (7578ed0)
- daemon,bridge: webhook tracker scoped to base + Beam card heuristic mirrors server (e1b08ad)
- daemon,cli,a2ui: scope cross-base drops, walk to workspace root, preserve A2UI escape-hatch fields (fdf3ad9)
- daemon,cli: proactive locations keyed by base + a2ui handles null (e8e07d0)
- daemon,cli: restore default-base schedules + tighten A2UI heuristic (58766a2)
- daemon,cli: three regressions from round-6 fixes (a6f9d98)
- **daemon,se...
v1.22.1
Bug Fixes
- ci: sync package-lock.json with package.json and add lockfile guardrail (#)
The v1.22.0 release bumped @portel/photon-core from ^2.20.0 to ^2.22.0 in package.json but bun install did not regenerate package-lock.json. CI and Release workflows run 'npm ci' which requires the lock file to match exactly -- both workflows failed with EUSAGE.
Full changelog: v1.22.0...v1.22.1
v1.22.0
Highlights
Full OpenTelemetry stack: traces + metrics + logs
Set OTEL_EXPORTER_OTLP_ENDPOINT, install @opentelemetry/sdk-node, and every span/counter/histogram/log record exports automatically. See docs/guides/observability.md for the one-page setup.
Observability
- W3C
traceparentpropagation with parent-context chaining acrossthis.call() photon.tool.durationhistogram,photon.tool.calls/errorscounters,photon.circuit_breaker.transitions,photon.rate_limit.rejections,photon.bulkhead.rejectionsAsyncLocalStoragerequest context (getRequestContext()) with ambientphoton/tool/traceId/caller- Logger auto-enrichment from ambient context; OTel logs bridge via
@opentelemetry/api-logs recordExceptionwith full stack viaError.causechain- Force-sampled error spans
Error handling
- MCP tool errors return
structuredContent.errorwith{ type, retryable, message }for typed auto-retry - Classifications:
circuit_open,rate_limited,bulkhead_full,validation_error,timeout_error,network_error,permission_error,not_found_error PhotonErrornative{ cause }support via photon-core 2.21+wrapErrorpreserves root cause chain
Resilience
- Circuit breaker half-open probe latch (only one probe allowed through)
@bulkhead Nmiddleware for concurrent-execution cap- Circuit state-change broadcasts for reactive UI updates
Health
GET /api/health— liveness/readiness with per-subsystem breakdown (runtime, daemon, photons, circuits); returns 503 when degradedGET /api/health/circuits— per-circuit state detail
AG-UI
RUN_ERRORcarriescode,retryable,runId,threadId- Every event includes
rawEvent.traceparentfor OTel correlation - Capability handshake:
experimental['ag-ui'].featuresadvertises server-side features
Promise coverage
65/65 assertions pass; Intent 10 (Standards-Aligned) grew from 10 → 27 documented assertions.
Dependencies
@portel/photon-core ^2.22.0 (from ^2.20.0):
PhotonError({ cause })constructor (2.21.0)@bulkheadmiddleware (2.22.0)- Audit path fixes for flat local-namespace layout
Full changelog: v1.21.0...v1.22.0
v1.21.0
v1.20.1
1.20.1 (2026-04-10)
Features
- add hideCloseButton property to photon-studio component (39a4b80)
- photon creation flow, MCP config export, and UI refinements (8098d8f)
- wire up pending approvals for deferred elicitations (6fff785)
Bug Fixes
- daemon stop→start race condition and worker spawn ceiling timeout (07d5a35)
- emit progress messages during worker initialization phases (55e748e)
- log stale symlink cleanup during photon discovery (a40eaea)
- update photon-core to v2.18.1 for broken symlink cleanup (76dccee)
- wire hideCloseButton on studio embed and default to source tab (4f9c5b5)
- worker dep resolution during spawn and client retry on connection close (a242d40)
v1.20.0
1.20.0 (2026-04-08)
Features
- add draggable resize handle to split pane divider (2661878)
- add sidebar resize handle with localStorage persistence (2c9b8c1)
- add tab switcher (App / Methods / Log) to main toolbar (a4d0bf4)
- beam UI improvements — sidebar tabs, bridge extensions, app renderer updates (a0454c4)
- gate edit controls on photon editability (951043d)
- merge context-bar into main-toolbar row to eliminate wasted vertical space (0c9efaa)
- namespace migration, beam route encoding, forking improvements, and test updates (1209827)
Bug Fixes
- add file locking for approvals and audit log to prevent race conditions (9775b7c)
- add global error handlers and replace silent catch blocks with logging (7cd8b2c)
- app tab fills viewport with no outer scroll or methods hint (08ded4b)
- block all studio/edit entry points for non-editable photons (a4db38c)
- cap activity log height so custom apps get their full vertical space (11e770f)
- cap method card grid column width at 380px to prevent overwide cards on large screens (1ddc189)
- constrain app tab to available viewport height without outer scroll (d26660a)
- fall back to auto-discovery when asset resolvedPath does not exist (88e4158)
- guard daemon socket connections against ENOENT on fresh install (dc006c6)
- move toolbars into scroll container, remove negative-margin hack (6b0bcfa)
- pin activity log to bottom, eliminate competing scrollbars in main area (73d058c)
- prevent command injection in marketplace fork/contribute operations (5ec76ae)
- prevent race conditions in daemon channel iteration, watcher debounce, and worker calls (bf0f6f4)
- prevent XSS by replacing innerHTML with safe DOM construction (7638223)
- reduce double-gap spacing between photon header and anchor nav (30075a7)
- remove border-radius clipping on app-viewport in app tab mode (6204e87)
- resolve singleton initialization races and clean up leaked timers (a5066a0)
- restore app sidebar, fill log tab height, fix app renderer flex (bef4e51)
- restrict CORS to localhost and add CSRF protection on marketplace endpoints (8212d02)
- route split pane progress events to the correct panel (3bf439a)
- set correct mainTab when loading app photon via URL route (fe9c888)
- use stable calc heights for app tab to prevent resize loop vibration (732c314)
v1.19.0
Features
- Channel support —
@channeltag turns photons into Claude Code channels via capabilities negotiation - Client-agnostic channel support via clientInfo name detection
- Channel permission relay and callable channel object (
this.channel()) - MCP Streamable HTTP — always-on for SSE mode, compatible with llama.cpp and modern MCP clients
- Elicitation custom message +
render('guide')stepper widget
Bug Fixes
- MCP Streamable HTTP: add
event: message+id:to SSE stream per spec - CORS: allow
Mcp-Protocol-Versionheader, add CORS headers to all responses (202, DELETE, 405) - Clean SSE startup output —
⚡ web → http://localhost:3000/mcpwith loader noise suppressed - Channel routing through daemon pub/sub with proper namespace isolation
- Bind instance context when capturing emit for channel injection
- Pass baseDir to MemoryProvider for correct directory resolution
- Auto-detect photon directory from cwd when PHOTON_DIR is not set
Refactor
- Migrate photon data and cache paths to
~/.photon/.data/directory - Pre-release check: use PHOTON_DIR env var instead of moving ~/.photon