@aion0/forge 0.9.2 → 0.9.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/RELEASE_NOTES.md +4 -59
- package/lib/telegram-bot.ts +9 -3
- package/package.json +1 -1
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,66 +1,11 @@
|
|
|
1
|
-
# Forge v0.9.
|
|
1
|
+
# Forge v0.9.3
|
|
2
2
|
|
|
3
3
|
Released: 2026-05-26
|
|
4
4
|
|
|
5
|
-
## Changes since v0.9.
|
|
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
|
-
|
|
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
|
|
5
|
+
## Changes since v0.9.2
|
|
15
6
|
|
|
16
7
|
### Other
|
|
17
|
-
-
|
|
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)
|
|
8
|
+
- fix(telegram): surface fetch failure details in send() error log
|
|
64
9
|
|
|
65
10
|
|
|
66
|
-
**Full Changelog**: https://github.com/aiwatching/forge/compare/v0.9.
|
|
11
|
+
**Full Changelog**: https://github.com/aiwatching/forge/compare/v0.9.2...v0.9.3
|
package/lib/telegram-bot.ts
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
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
|
}
|