@aion0/forge 0.10.69 → 0.10.70

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,13 +1,23 @@
1
- # Forge v0.10.69
1
+ # Forge v0.10.70
2
2
 
3
3
  Released: 2026-06-11
4
4
 
5
- ## Changes since v0.10.68
5
+ ## Changes since v0.10.69
6
6
 
7
7
  ### Other
8
- - fix(idp): decouple probe host from IdP login host (probe_host)
9
- - fix(terminal): resolve absolute claude binary on tab restore
10
- - feat(pipeline): git OTP/2FA preflight + auth-blocked alerts
8
+ - revert: remove CLI quick-setup wizard + AUTH_SECRET persist (keep BRIDGE/CHAT port fixes)
9
+ - feat(setup): ask for department in enterprise wizard
10
+ - fix(auth): persist AUTH_SECRET so sessions survive refresh/restart
11
+ - fix(server): per-instance CHAT_PORT (webPort+5) — fixes 2nd-instance settings/sync
12
+ - feat(server): minimal first-run quick setup (public/enterprise)
13
+ - revert: remove first-run wizard + AUTH_SECRET persist + onboarding tweaks
14
+ - fix(setup): skip first-run wizard when instance already configured
15
+ - fix(setup): normalize half-typed email against tenant domain
16
+ - fix(auth): persist AUTH_SECRET so sessions survive refresh/restart
17
+ - fix(onboarding): show banner only, don't auto-open the modal each load
18
+ - fix(server): per-instance BRIDGE_PORT (webPort+4) + wizard sets onboardingCompleted
19
+ - feat(server): first-run public/enterprise quick-setup wizard
20
+ - fix(pipeline): run finalizePipeline on git-preflight abort
11
21
 
12
22
 
13
- **Full Changelog**: https://github.com/aiwatching/forge/compare/v0.10.68...v0.10.69
23
+ **Full Changelog**: https://github.com/aiwatching/forge/compare/v0.10.69...v0.10.70
@@ -123,6 +123,19 @@ const workspacePort = parseInt(getArg('--workspace-port')) || (webPort + 2);
123
123
  // second instance (dev-test on a different webPort) collided with the
124
124
  // main instance. Offset from webPort like every other service.
125
125
  const mcpPort = parseInt(getArg('--mcp-port')) || (webPort + 3);
126
+ // Browser-bridge standalone. Was hardcoded to 8407 everywhere (standalone,
127
+ // bridge-info route, extension fallback), so a second instance (e.g. --port
128
+ // 4000) reused the 8403 instance's bridge → the extension connected to the
129
+ // wrong instance and its token was rejected. Offset from webPort like the
130
+ // others; default 8403+4 = 8407 keeps existing single-instance pairings.
131
+ const bridgePort = parseInt(getArg('--bridge-port')) || (webPort + 4);
132
+ // Chat standalone. Was hardcoded to 8408 everywhere — a second instance
133
+ // (--port 4000) failed to bind it, then its next-server fell back to the
134
+ // 8408 default and hit the FIRST instance's chat standalone with a token
135
+ // signed for the wrong instance → "Sync failed: unauthorized" on
136
+ // settings/marketplace. Offset like bridge; default 8403+5 = 8408 keeps
137
+ // existing single-instance behaviour.
138
+ const chatPort = parseInt(getArg('--chat-port')) || (webPort + 5);
126
139
  const DATA_DIR = getArg('--dir')?.replace(/^~/, homedir()) || join(homedir(), '.forge', 'data');
127
140
 
128
141
  const PID_FILE = join(DATA_DIR, 'forge.pid');
@@ -245,6 +258,8 @@ process.env.PORT = String(webPort);
245
258
  process.env.TERMINAL_PORT = String(terminalPort);
246
259
  process.env.WORKSPACE_PORT = String(workspacePort);
247
260
  process.env.MCP_PORT = String(mcpPort);
261
+ process.env.BRIDGE_PORT = String(bridgePort);
262
+ process.env.CHAT_PORT = String(chatPort);
248
263
  process.env.FORGE_DATA_DIR = DATA_DIR;
249
264
 
250
265
  // ── Password setup (first run or --reset-password) ──
@@ -318,6 +333,7 @@ if (!isStop && !addEnterpriseKeyOnly) {
318
333
  }
319
334
  }
320
335
 
336
+
321
337
  // ── Enterprise keys (--enterprise-key=…) ──
322
338
  //
323
339
  // Each key is encrypted with AES-256-GCM via the same `.encrypt-key`
package/lib/pipeline.ts CHANGED
@@ -1068,6 +1068,10 @@ export function startPipeline(
1068
1068
  pipeline.error = `${blocked.message}${blocked.action ? `\nRun: ${blocked.action}` : ''}`;
1069
1069
  pipeline.completedAt = new Date().toISOString();
1070
1070
  savePipeline(pipeline);
1071
+ // Same settle housekeeping every other failure path gets — without it
1072
+ // schedule/binding-fired runs linger as "running" in pipeline_runs
1073
+ // until zombie reconciliation catches them.
1074
+ finalizePipeline(pipeline);
1071
1075
  void notifyAuthBlocked({
1072
1076
  title: `Pipeline aborted — git auth required (${workflowName})`,
1073
1077
  body: blocked.message,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aion0/forge",
3
- "version": "0.10.69",
3
+ "version": "0.10.70",
4
4
  "description": "Unified AI workflow platform — multi-model task orchestration, persistent sessions, web terminal, remote access",
5
5
  "type": "module",
6
6
  "scripts": {