@aion0/forge 0.10.46 → 0.10.47

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/RELEASE_NOTES.md CHANGED
@@ -1,49 +1,12 @@
1
- # Forge v0.10.46
1
+ # Forge v0.10.47
2
2
 
3
3
  Released: 2026-06-08
4
4
 
5
- ## Changes since v0.10.45
6
-
7
- ### Features
8
- - feat: unified-auth Phase 2 — Web Sessions sweep in EnterpriseBadge
9
- - feat: unified-auth Phase 1 — GitLab SSH 2FA verify from EnterpriseBadge
5
+ ## Changes since v0.10.46
10
6
 
11
7
  ### Other
12
- - feat(ui): move Browser + Help into user dropdown menu
13
- - feat(scratch): auto-cleanup files older than scratchRetentionDays (default 7)
14
- - feat(chat): save_scratch_file builtin tool — direct file write + download link
15
- - fix(chat): listMessages returns the LAST N, not the first N
16
- - fix(chat-standalone): bump default session GET limit 500 -> 2000
17
- - fix(server): spawn next with --use-system-ca for corp SSL inspection
18
- - feat(migration): one-shot disk rename for renamed connector setting keys
19
- - feat(chat): autolink scratch/<file> paths to /api/scratch download endpoint
20
- - diag(dispatch): drop temp default-fill logs
21
- - diag(dispatch): log default keys + arg state to forge.log (TEMP)
22
- - fix(connector alias): mantis default_project rename — drop legacy key
23
- - fix(install.sh --local): wipe .next + Turbopack cache before pnpm build
24
- - fix(dispatcher): two-pass default fill + per-connector legacy aliases
25
- - feat(idp-login): opt-in encrypted credential save
26
- - feat(idp-login): show/hide toggle on password input
27
- - feat(idp-login): per-entry selectors / username override / timeout; UI prefills username from email
28
- - feat(idp-login): surface trigger URL on per-IdP failure for manual login
29
- - feat(idp-login): trigger_url override + transcript-based failure detection
30
- - feat(idp-login): show manual command line when terminal-keystroke fails
31
- - feat(idp-login): multi-IdP support — _idp accepts array
32
- - ui: remove standalone GitLab 2FA section from EnterpriseBadge
33
- - feat(unified-auth): template-driven post_login_terminal commands
34
- - fix(gitlab-2fa keystroke): split OK/FAIL into separate atomic markers
35
- - fix(gitlab-2fa keystroke): only match prompt in NEW Terminal output
36
- - fix(gitlab-2fa keystroke): clipboard+paste instead of keystroke-char-by-char
37
- - simplify(gitlab-2fa): bare ssh, drop noisy options
38
- - fix(gitlab-2fa keystroke): wait for OTP prompt before typing OTP
39
- - feat(gitlab-2fa): keystroke fallback via macOS Terminal + System Events
40
- - feat(unified-auth): read IdP host + SAML SPs from wizard template _idp
41
- - fix(unified-auth): only use SAML SPs as IdP trigger (drop gitlab/teams)
42
- - feat(unified-auth): Phase 3 — one-shot SAML IdP login
43
- - feat(gitlab-2fa): manual fallback for FortiClient per-process VPN block
44
- - fix(gitlab-2fa): bump ConnectTimeout 8s→30s, outer 15s→60s
45
- - fix(gitlab-2fa): catch 'Operation timed out' (macOS ssh) + strip echoed OTP from error
46
- - fix(gitlab-2fa): aggressive OTP send + surface ssh transcript on failure
8
+ - ui(header): selected tab uses accent tint, not bg-secondary shade
9
+ - ui(header): bell for Alerts, stacked dept/name pill, +1px nav font
47
10
 
48
11
 
49
- **Full Changelog**: https://github.com/aiwatching/forge/compare/v0.10.45...v0.10.46
12
+ **Full Changelog**: https://github.com/aiwatching/forge/compare/v0.10.46...v0.10.47
@@ -422,9 +422,9 @@ export default function Dashboard({ user }: { user: any }) {
422
422
  <button
423
423
  key={mode}
424
424
  onClick={() => setViewMode(mode)}
425
- className={`text-[11px] px-2.5 py-0.5 rounded transition-colors ${
425
+ className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
426
426
  viewMode === mode
427
- ? 'bg-[var(--bg-secondary)] text-[var(--text-primary)] shadow-sm'
427
+ ? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
428
428
  : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
429
429
  }`}
430
430
  >
@@ -435,9 +435,9 @@ export default function Dashboard({ user }: { user: any }) {
435
435
  {/* Docs */}
436
436
  <button
437
437
  onClick={() => setViewMode('docs')}
438
- className={`text-[11px] px-2.5 py-0.5 rounded transition-colors ${
438
+ className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
439
439
  viewMode === 'docs'
440
- ? 'bg-[var(--bg-secondary)] text-[var(--text-primary)] shadow-sm'
440
+ ? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
441
441
  : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
442
442
  }`}
443
443
  >
@@ -451,9 +451,9 @@ export default function Dashboard({ user }: { user: any }) {
451
451
  onClick={() => {
452
452
  if (!['tasks', 'pipelines', 'schedules'].includes(viewMode)) setViewMode('schedules');
453
453
  }}
454
- className={`text-[11px] px-2.5 py-0.5 rounded transition-colors ${
454
+ className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
455
455
  ['tasks', 'pipelines', 'schedules'].includes(viewMode)
456
- ? 'bg-[var(--bg-secondary)] text-[var(--text-primary)] shadow-sm'
456
+ ? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
457
457
  : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
458
458
  }`}
459
459
  >
@@ -468,9 +468,9 @@ export default function Dashboard({ user }: { user: any }) {
468
468
  {/* Marketplace */}
469
469
  <button
470
470
  onClick={() => setViewMode('skills')}
471
- className={`text-[11px] px-2.5 py-0.5 rounded transition-colors ${
471
+ className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
472
472
  viewMode === 'skills'
473
- ? 'bg-[var(--bg-secondary)] text-[var(--text-primary)] shadow-sm'
473
+ ? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
474
474
  : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
475
475
  }`}
476
476
  >
@@ -490,13 +490,15 @@ export default function Dashboard({ user }: { user: any }) {
490
490
  </span>
491
491
  )}
492
492
  <span className="w-[2px] h-4 bg-[var(--text-secondary)]/30" />
493
- {/* Alerts */}
493
+ {/* Alerts — bell glyph keeps the same role; unread pill rides the bell. */}
494
494
  <div className="relative">
495
495
  <button
496
496
  onClick={() => { setShowNotifications(v => !v); setShowUserMenu(false); }}
497
- className="text-[10px] text-[var(--text-secondary)] hover:text-[var(--text-primary)] relative px-1"
497
+ className="text-[14px] leading-none text-[var(--text-secondary)] hover:text-[var(--text-primary)] relative px-1"
498
+ title="Alerts"
499
+ aria-label="Alerts"
498
500
  >
499
- Alerts
501
+ <span aria-hidden>🔔</span>
500
502
  {unreadCount > 0 && (
501
503
  <span className="absolute -top-1.5 -right-1.5 min-w-[14px] h-[14px] rounded-full bg-[var(--red)] text-[8px] text-white flex items-center justify-center px-1 font-bold">
502
504
  {unreadCount > 99 ? '99+' : unreadCount}
@@ -620,14 +622,17 @@ export default function Dashboard({ user }: { user: any }) {
620
622
  <div className="relative">
621
623
  <button
622
624
  onClick={() => { setShowUserMenu(v => !v); setShowNotifications(false); }}
623
- className="text-[10px] text-[var(--text-secondary)] hover:text-[var(--text-primary)] flex items-center gap-1 px-1"
625
+ className="text-[var(--text-secondary)] hover:text-[var(--text-primary)] flex items-center gap-1 px-1"
624
626
  >
625
- {profileDept && (
626
- <span className="text-[9px] px-1 py-[1px] rounded bg-emerald-500/15 text-emerald-500 border border-emerald-500/30 mr-1" title="Active department">
627
- {profileDept}
628
- </span>
629
- )}
630
- {displayName} <span className="text-[8px]">▾</span>
627
+ <span className="flex flex-col items-end leading-tight">
628
+ {profileDept && (
629
+ <span className="text-[8px] px-1 rounded bg-emerald-500/15 text-emerald-500 border border-emerald-500/30" title="Active department">
630
+ {profileDept}
631
+ </span>
632
+ )}
633
+ <span className="text-[9px]">{displayName}</span>
634
+ </span>
635
+ <span className="text-[8px]">▾</span>
631
636
  </button>
632
637
  {showUserMenu && (
633
638
  <>
@@ -758,9 +763,9 @@ export default function Dashboard({ user }: { user: any }) {
758
763
  <button
759
764
  key={m}
760
765
  onClick={() => setViewMode(m)}
761
- className={`text-[11px] px-2.5 py-0.5 rounded transition-colors ${
766
+ className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
762
767
  viewMode === m
763
- ? 'bg-[var(--bg-secondary)] text-[var(--text-primary)] shadow-sm'
768
+ ? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
764
769
  : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
765
770
  }`}
766
771
  >
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aion0/forge",
3
- "version": "0.10.46",
3
+ "version": "0.10.47",
4
4
  "description": "Unified AI workflow platform — multi-model task orchestration, persistent sessions, web terminal, remote access",
5
5
  "type": "module",
6
6
  "scripts": {