@aion0/forge 0.9.2 → 0.9.4

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,66 +1,8 @@
1
- # Forge v0.9.2
1
+ # Forge v0.9.4
2
2
 
3
3
  Released: 2026-05-26
4
4
 
5
- ## Changes since v0.9.1
5
+ ## Changes since v0.9.3
6
6
 
7
- ### Bug Fixes
8
- - fix(jobs/run): manual fire actually passes trigger='manual' to executeRun
9
- - fix: nuke all remaining CommonJS require() in task / jobs hot paths
10
7
 
11
- ### Documentation
12
- - feat(pipeline): {{run.tmp_dir}} per-run scratch + GC + Settings UI for API profiles
13
- - feat(schedules): skills field + reconciler race fix + chat action SSE fanout
14
- - docs: team workflow integration + side-panel UI design brief
15
-
16
- ### Other
17
- - chore(server): drop misleading 'Stop:' line from start output
18
- - feat(pipeline): for_each loop primitive + before: setup-phase hook
19
- - feat(pipeline): {{run.tmp_dir}} per-run scratch + GC + Settings UI for API profiles
20
- - feat(schedules): skills field + reconciler race fix + chat action SSE fanout
21
- - fix(server): kill zombie tsx task-runner processes from prior dev sessions
22
- - feat(pipeline): {{raw:…}} template variant — bypass shell ANSI-C escape
23
- - chore(sync): cache-bust workflow fetches + force flag for connector sync
24
- - feat(schedules): connector_tool Test button + tool-test endpoint
25
- - feat(schedules): edit mode + run details + delete-resurrection fix
26
- - feat(pipeline): extended input field spec — type/enum/required/default/multiline
27
- - fix(schedules): connector_tool picker + schema-driven Step 2 form
28
- - feat(schedules v2): unified describeAction helper for cards
29
- - feat(schedules v2): Phase 6 — action=telegram via existing bot
30
- - feat(schedules v2): Phase 5 — action=email via SMTP
31
- - feat(schedules v2): Phase 4 — action=chat appends body output to a session
32
- - feat(schedules v2): Phase 3 — body_kind=connector_tool dispatch + UI picker
33
- - feat(schedules v2): Phase 2 — body_kind=skill dispatch + UI picker
34
- - feat(schedules v2): Phase 1 — schema rename + body/action field extension
35
- - fix(pipeline): reconciler honors retries; task-manager catches log err.stack
36
- - fix(schedules): rename pipeline schema route from [name] to [id]
37
- - docs(schedules): help-docs/13-schedules.md for Help AI + users
38
- - feat(schedules UI): Forge web SchedulesView + 3-step Create modal
39
- - feat(schedules): backend — pipeline_schedules + scheduler + 8 API + pipeline schema
40
- - fix(claude-process): kill require() on Claude task spawn path
41
- - fix(jobs/run): manual fire actually passes trigger='manual' to executeRun
42
- - feat(bulk-delete): cleanup old tasks + pipeline runs by age
43
- - fix(jobs UI): refresh + poll while expanded — Cancel/Stop buttons appear after Run
44
- - feat(jobs UI): Dispatched pipelines list trims to running + last-terminal
45
- - fix(jobs): on_failure=stop skips manual fires — let user resume after failure
46
- - fix(pipeline): cascading cancel — task → node → pipeline → job, all in sync
47
- - feat(pipeline): per-node retry — retries: N + retry_delay_ms
48
- - fix(dirs): break dirs↔settings cycle without require() — kills last hot-path race
49
- - feat(jobs): on_failure policy — 'continue' (default) | 'stop'
50
- - feat(jobs/UI): aggregate status summary + deferred-queue hint
51
- - feat(jobs): monitor + cancel — Job tracks its dispatched pipelines, can stop drain or kill in-flight
52
- - fix(jobs): sequential mode drains deferred items across ticks regardless of schedule_kind
53
- - feat(connectors/gitlab): Sync to glab CLI button — unify token between Forge and shell
54
- - feat(jobs): isJobBusy gate — refuse double-fire + disable UI buttons
55
- - feat(jobs UI): show + toggle concurrency_mode in JobsView
56
- - feat(jobs): per-Job concurrency_mode — sequential by default
57
- - fix(notify): use globalThis Symbol for pipelineTaskIds, drop require()
58
- - fix(jobs/scheduler): reconcile zombie pipeline_runs before counting cap
59
- - fix(pipeline): empty try-catch audit — add console.warn where silence hid bugs
60
- - fix(pipeline): remove all CommonJS require() — package is type:module
61
- - refactor(pipeline): move 3 legacy builtins to marketplace
62
- - fix(pipeline): listWorkflows logs WHY a yaml was skipped
63
- - feat(jobs): pickDedupKey supports composite key (field1:field2)
64
-
65
-
66
- **Full Changelog**: https://github.com/aiwatching/forge/compare/v0.9.1...v0.9.2
8
+ **Full Changelog**: https://github.com/aiwatching/forge/compare/v0.9.3...v0.9.4
@@ -1709,12 +1709,18 @@ async function send(chatId: number, text: string): Promise<number | null> {
1709
1709
 
1710
1710
  const data = await res.json();
1711
1711
  if (!data.ok) {
1712
- console.error('[telegram] Send error:', data.description);
1712
+ console.error(`[telegram] Send error: ${res.status} ${data.description || JSON.stringify(data)}`);
1713
1713
  return null;
1714
1714
  }
1715
1715
  return data.result?.message_id || null;
1716
- } catch (err) {
1717
- console.error('[telegram] Send failed:', err);
1716
+ } catch (err: any) {
1717
+ // err is opaque on Node fetch failures — Error objects stringify to `{}`
1718
+ // because their properties are non-enumerable. Surface message/code/cause
1719
+ // explicitly so the log actually tells us what broke.
1720
+ const msg = err?.message ?? String(err);
1721
+ const code = err?.code ?? err?.cause?.code ?? '';
1722
+ const cause = err?.cause?.message ?? '';
1723
+ console.error(`[telegram] Send failed: ${msg}${code ? ' [' + code + ']' : ''}${cause ? ' (cause: ' + cause + ')' : ''}`);
1718
1724
  return null;
1719
1725
  }
1720
1726
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aion0/forge",
3
- "version": "0.9.2",
3
+ "version": "0.9.4",
4
4
  "description": "Unified AI workflow platform — multi-model task orchestration, persistent sessions, web terminal, remote access",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -51,7 +51,7 @@
51
51
  "next": "^16.2.1",
52
52
  "next-auth": "5.0.0-beta.30",
53
53
  "node-pty": "1.0.0",
54
- "nodemailer": "^8.0.8",
54
+ "nodemailer": "^7.0.7",
55
55
  "react": "^19.2.4",
56
56
  "react-dom": "^19.2.4",
57
57
  "react-markdown": "^10.1.0",
@@ -71,7 +71,7 @@
71
71
  "@tailwindcss/postcss": "^4.2.1",
72
72
  "@types/better-sqlite3": "^7.6.13",
73
73
  "@types/node": "^25.4.0",
74
- "@types/nodemailer": "^8.0.0",
74
+ "@types/nodemailer": "^7.0.0",
75
75
  "@types/react": "^19.2.14",
76
76
  "@types/react-dom": "^19.2.3",
77
77
  "@types/ws": "^8.18.1",