@bastani/atomic 0.9.26-alpha.3 → 0.9.26-alpha.5
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/CHANGELOG.md +16 -0
- package/dist/builtin/intercom/CHANGELOG.md +6 -0
- package/dist/builtin/intercom/broker/broker.ts +9 -1
- package/dist/builtin/intercom/index.bundle.mjs +11 -2
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/intercom/types.ts +13 -0
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/package.json +3 -3
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +16 -0
- package/dist/builtin/workflows/builtin/{chunk-kfsnh3w7.js → chunk-613yaa53.js} +128 -45
- package/dist/builtin/workflows/builtin/{chunk-rqmasd3d.js → chunk-6kqrk0pf.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-wz783pvd.js → chunk-ea6nrbn3.js} +1 -1
- package/dist/builtin/workflows/builtin/goal.js +2 -2
- package/dist/builtin/workflows/builtin/index.js +3 -3
- package/dist/builtin/workflows/builtin/ralph.js +2 -2
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +653 -303
- package/dist/builtin/workflows/src/index.js +201 -77
- package/dist/core/agent-session-export.js +1 -1
- package/dist/core/agent-session-export.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts +3 -3
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +3 -3
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/api-types.d.ts +3 -1
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +5 -2
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js +5 -0
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-bindings.d.ts +1 -1
- package/dist/core/extensions/loader-bindings.d.ts.map +1 -1
- package/dist/core/extensions/loader-bindings.js +1 -0
- package/dist/core/extensions/loader-bindings.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +6 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +2 -1
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.js.map +1 -1
- package/dist/core/extensions/tool-types.d.ts +3 -0
- package/dist/core/extensions/tool-types.d.ts.map +1 -1
- package/dist/core/extensions/tool-types.js.map +1 -1
- package/dist/core/extensions/ui-types.d.ts +2 -2
- package/dist/core/extensions/ui-types.d.ts.map +1 -1
- package/dist/core/extensions/ui-types.js.map +1 -1
- package/dist/core/model-resolver-defaults.js +1 -1
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
- package/dist/core/package-manager-auto-resources.js +6 -2
- package/dist/core/package-manager-auto-resources.js.map +1 -1
- package/dist/core/package-manager-resolver.d.ts.map +1 -1
- package/dist/core/package-manager-resolver.js +4 -2
- package/dist/core/package-manager-resolver.js.map +1 -1
- package/dist/core/settings-manager-resource-accessors.js +7 -3
- package/dist/core/settings-manager-resource-accessors.js.map +1 -1
- package/dist/core/settings-merge.d.ts.map +1 -1
- package/dist/core/settings-merge.js +10 -0
- package/dist/core/settings-merge.js.map +1 -1
- package/dist/core/settings-types.d.ts +7 -1
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +20 -1
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/tools.d.ts +3 -1
- package/dist/extensions/mcp/tools.d.ts.map +1 -1
- package/dist/extensions/mcp/tools.js +19 -13
- package/dist/extensions/mcp/tools.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.d.ts +2 -3
- package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
- package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector-list.js +3 -1
- package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
- package/dist/modes/interactive/components/config-selector-project-scope.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector-project-scope.js +2 -1
- package/dist/modes/interactive/components/config-selector-project-scope.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +2 -5
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +14 -40
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +3 -3
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +6 -1
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +5 -0
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.js +9 -0
- package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
- package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-render-service.js +10 -1
- package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
- package/dist/utils/image-convert.d.ts +5 -0
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js +36 -6
- package/dist/utils/image-convert.js.map +1 -1
- package/docs/extensions.md +6 -0
- package/docs/intercom/reference.md +13 -1
- package/docs/providers.md +10 -0
- package/docs/settings.md +28 -1
- package/docs/workflows/operations.md +27 -3
- package/npm-shrinkwrap.json +71 -92
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.9.26-alpha.5] - 2026-10-03
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added `pi.registerToolRenderer()` to choose renderers for any tool, including tools not yet registered ([#10285](https://github.com/earendil-works/pi/issues/10285)).
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Fixed managed workflow PostgreSQL staying down after shutdown when its old launch options were missing. Database-unavailable errors and workflow status now show the provider, credential-redacted endpoint, and retained recovery refusal or failure ([#3413](https://github.com/bastani-inc/atomic/issues/3413)).
|
|
14
|
+
- Fixed NVIDIA's built-in default pointing to a model missing from its current catalog. Automatic selection now prefers Nemotron 3 Ultra 550B A55B.
|
|
15
|
+
- Fixed MCP tool calls in resumed sessions and HTML exports rendering fully expanded before their server connects, or when it never connects ([#10285](https://github.com/earendil-works/pi/issues/10285)).
|
|
16
|
+
- Fixed JPEG, GIF, and WebP images rendered by extensions through `Image` not appearing on Kitty-protocol terminals ([#10292](https://github.com/earendil-works/pi/issues/10292)).
|
|
17
|
+
- Fixed fullscreen Kitty images collapsing after scrolling in WezTerm ([#10319](https://github.com/earendil-works/pi/issues/10319)).
|
|
18
|
+
- Fixed `codemode` scripts that print in a loop exhausting memory. Scripts now fail after exceeding 16 Mi characters or 100000 output items ([#10283](https://github.com/earendil-works/pi/issues/10283)).
|
|
19
|
+
- Fixed resumed MCP calls and HTML exports assigning the wrong server to ambiguous tool names. Calls without known renderers now retain their full identifier when the server/tool boundary cannot be recovered.
|
|
20
|
+
|
|
5
21
|
## [0.9.26-alpha.3] - 2026-10-03
|
|
6
22
|
|
|
7
23
|
### Added
|
|
@@ -4,6 +4,12 @@ All notable changes to the `pi-intercom` extension will be documented in this fi
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.9.26-alpha.4] - 2026-10-02
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Fixed sticky workflow messages disappearing during stage startup, and added per-stage delivery and skip results to `intercom list` so retained future-message counts cannot be mistaken for receipt by every stage ([#3406](https://github.com/bastani-inc/atomic/issues/3406)).
|
|
12
|
+
|
|
7
13
|
## [0.9.20] - 2026-09-24
|
|
8
14
|
|
|
9
15
|
### Added
|
|
@@ -232,7 +232,13 @@ function isWorkflowPossibleStageAnnouncements(
|
|
|
232
232
|
((groupRootRunId !== undefined && groupRootRunId === parsed.rootRunId) || runId === parsed.rootRunId) &&
|
|
233
233
|
typeof announcement.queuedCount === "number" &&
|
|
234
234
|
Number.isInteger(announcement.queuedCount) &&
|
|
235
|
-
announcement.queuedCount >= 0
|
|
235
|
+
announcement.queuedCount >= 0 &&
|
|
236
|
+
(announcement.deliveryOnly === undefined || announcement.deliveryOnly === true) &&
|
|
237
|
+
(announcement.deliveryStates === undefined || (Array.isArray(announcement.deliveryStates) && announcement.deliveryStates.every((delivery) =>
|
|
238
|
+
delivery !== null && typeof delivery === "object" &&
|
|
239
|
+
typeof delivery.messageId === "string" && typeof delivery.runId === "string" &&
|
|
240
|
+
typeof delivery.stageId === "string" && typeof delivery.state === "string" &&
|
|
241
|
+
typeof delivery.reason === "string" && (delivery.sessionId === undefined || typeof delivery.sessionId === "string"))))
|
|
236
242
|
);
|
|
237
243
|
})
|
|
238
244
|
);
|
|
@@ -545,6 +551,8 @@ class IntercomBroker {
|
|
|
545
551
|
runId,
|
|
546
552
|
target: row.target,
|
|
547
553
|
queuedCount: row.queuedCount,
|
|
554
|
+
...(row.deliveryStates === undefined ? {} : { deliveryStates: row.deliveryStates }),
|
|
555
|
+
...(row.deliveryOnly === undefined ? {} : { deliveryOnly: row.deliveryOnly }),
|
|
548
556
|
group: roster.group,
|
|
549
557
|
});
|
|
550
558
|
}
|
|
@@ -3293,7 +3293,8 @@ function formatWorkflowStageRow(stage) {
|
|
|
3293
3293
|
return `- \`${stage.target}\` [${stage.lifecycle.toUpperCase()}] workflow stage: ${stage.stageName}${stage.sessionId === undefined ? "" : ` session: \`${stage.sessionId}\``}`;
|
|
3294
3294
|
}
|
|
3295
3295
|
function formatWorkflowFutureStageRow(stage) {
|
|
3296
|
-
return `- \`${stage.target}\` [future] ${stage.queuedCount} queued message${stage.queuedCount === 1 ? "" : "s"}
|
|
3296
|
+
return `- \`${stage.target}\` [${stage.deliveryOnly === true ? "delivery" : "future"}] ${stage.queuedCount} queued message${stage.queuedCount === 1 ? "" : "s"}${(stage.deliveryStates ?? []).map((delivery) => `
|
|
3297
|
+
delivery ${delivery.messageId} stage ${delivery.runId}/${delivery.stageId}${delivery.sessionId === undefined ? "" : ` session ${delivery.sessionId}`} ${delivery.state} — ${delivery.reason}`).join("")}`;
|
|
3297
3298
|
}
|
|
3298
3299
|
function registerIntercomTool(pi, deps) {
|
|
3299
3300
|
const retryIdentities = new RetryIdentityReservations({ maxEntries: deps.retryIdentityMaxEntries });
|
|
@@ -6618,6 +6619,8 @@ function piIntercomExtension(pi, testOverrides = {}) {
|
|
|
6618
6619
|
const messageGeneration = runtimeGeneration;
|
|
6619
6620
|
const liveContext = getLiveContext(ctx, messageGeneration);
|
|
6620
6621
|
if (!liveContext) {
|
|
6622
|
+
if (receivedBeforeStageStart)
|
|
6623
|
+
throw new Error("Intercom session retired before pending-stage delivery; message remains queued");
|
|
6621
6624
|
return;
|
|
6622
6625
|
}
|
|
6623
6626
|
replyTracker = bindWorkflowReplyTracker(liveContext, replyTracker);
|
|
@@ -7264,7 +7267,13 @@ function piIntercomExtension(pi, testOverrides = {}) {
|
|
|
7264
7267
|
return;
|
|
7265
7268
|
}
|
|
7266
7269
|
await ensureConnected("startup");
|
|
7267
|
-
|
|
7270
|
+
const receivedMessageIds = ctx.sessionManager.getBranch().flatMap((entry) => {
|
|
7271
|
+
if (entry.type !== "custom_message" || entry.customType !== "intercom_message")
|
|
7272
|
+
return [];
|
|
7273
|
+
const id = entry.details?.message?.id;
|
|
7274
|
+
return typeof id === "string" ? [id] : [];
|
|
7275
|
+
});
|
|
7276
|
+
await pendingStageDelivery.deliverPending((from, message) => handleIncomingMessage(ctx, from, message, undefined, true), { sessionId: ctx.sessionManager.getSessionId(), receivedMessageIds });
|
|
7268
7277
|
});
|
|
7269
7278
|
pi.registerMessageRenderer("intercom_message", (message, _options, theme) => {
|
|
7270
7279
|
const details = message.details;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/intercom",
|
|
3
|
-
"version": "0.9.26-alpha.
|
|
3
|
+
"version": "0.9.26-alpha.5",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Atomic extension providing a private coordination channel between parent and child agent sessions. Fork of: https://github.com/nicobailon/pi-intercom",
|
|
6
6
|
"contributors": [
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"@bastani/atomic": "*",
|
|
47
|
-
"@earendil-works/pi-tui": "^1.0.
|
|
47
|
+
"@earendil-works/pi-tui": "^1.0.1",
|
|
48
48
|
"typebox": "*"
|
|
49
49
|
},
|
|
50
50
|
"peerDependenciesMeta": {
|
|
@@ -38,11 +38,22 @@ export interface WorkflowRunParentAnnouncement {
|
|
|
38
38
|
readonly stageKeys: readonly string[];
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
export interface WorkflowStickyDeliveryState {
|
|
42
|
+
readonly messageId: string;
|
|
43
|
+
readonly runId: string;
|
|
44
|
+
readonly stageId: string;
|
|
45
|
+
readonly sessionId?: string;
|
|
46
|
+
readonly state: string;
|
|
47
|
+
readonly reason: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
41
50
|
export interface WorkflowPossibleStageAnnouncement {
|
|
42
51
|
/** Canonical depth-faithful path target, e.g. `workflow:<rootRunId>/orchestrator-*`. */
|
|
43
52
|
readonly target: string;
|
|
44
53
|
/** Current number of queued sticky entries matching this target. */
|
|
45
54
|
readonly queuedCount: number;
|
|
55
|
+
readonly deliveryStates?: readonly WorkflowStickyDeliveryState[];
|
|
56
|
+
readonly deliveryOnly?: true;
|
|
46
57
|
}
|
|
47
58
|
|
|
48
59
|
export interface WorkflowFutureStageRosterEntry {
|
|
@@ -51,6 +62,8 @@ export interface WorkflowFutureStageRosterEntry {
|
|
|
51
62
|
readonly target: string;
|
|
52
63
|
readonly queuedCount: number;
|
|
53
64
|
readonly group: string;
|
|
65
|
+
readonly deliveryStates?: readonly WorkflowStickyDeliveryState[];
|
|
66
|
+
readonly deliveryOnly?: true;
|
|
54
67
|
}
|
|
55
68
|
|
|
56
69
|
export interface SessionDirectory {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/subagents",
|
|
3
|
-
"version": "0.9.26-alpha.
|
|
3
|
+
"version": "0.9.26-alpha.5",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Atomic extension for delegating tasks to subagents with parallel execution. Fork of: https://github.com/nicobailon/pi-subagents",
|
|
6
6
|
"contributors": [
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"@bastani/atomic": "*",
|
|
37
37
|
"@bastani/pi-ai": "*",
|
|
38
|
-
"@earendil-works/pi-agent-core": "^1.0.
|
|
39
|
-
"@earendil-works/pi-tui": "^1.0.
|
|
38
|
+
"@earendil-works/pi-agent-core": "^1.0.1",
|
|
39
|
+
"@earendil-works/pi-tui": "^1.0.1",
|
|
40
40
|
"typebox": "*"
|
|
41
41
|
},
|
|
42
42
|
"peerDependenciesMeta": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/web-access",
|
|
3
|
-
"version": "0.9.26-alpha.
|
|
3
|
+
"version": "0.9.26-alpha.5",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Atomic extension for web search, URL fetching, GitHub repo cloning, PDF/video extraction. Fork of: https://github.com/nicobailon/pi-web-access",
|
|
6
6
|
"contributors": [
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"@bastani/atomic": "*",
|
|
34
|
-
"@earendil-works/pi-tui": "^1.0.
|
|
34
|
+
"@earendil-works/pi-tui": "^1.0.1"
|
|
35
35
|
},
|
|
36
36
|
"peerDependenciesMeta": {
|
|
37
37
|
"@bastani/atomic": {
|
|
@@ -6,6 +6,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.9.26-alpha.5] - 2026-10-03
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added `workflows.durability.systemDatabaseUrl` and `systemDatabaseUrlFile` in global and trusted project settings to choose a persistent workflow database without launcher-specific environment configuration. `DBOS_SYSTEM_DATABASE_URL` retains precedence; explicit selections never provision embedded PostgreSQL or Docker. Interactive and RPC sessions report the selected provider and host without credentials on the first workflow action; headless sessions print only a Docker fallback selection to stderr. Existing workflow-path arrays remain supported alongside the new object form with `paths` ([#3416](https://github.com/bastani-inc/atomic/issues/3416)).
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- Fixed managed PostgreSQL staying down after shutdown when its old launch options were missing. Recovery preserves cluster ownership and identity checks, and database-unavailable admission errors and workflow status now show the provider, credential-redacted endpoint, and retained probe or recovery failure ([#3413](https://github.com/bastani-inc/atomic/issues/3413)).
|
|
18
|
+
|
|
19
|
+
## [0.9.26-alpha.4] - 2026-10-02
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- Fixed sticky Intercom broadcasts to `workflow:<rootRunId>/**` missing later stages before their first model turn. Workflow status now reports per-stage delivery and skip results for retained messages ([#3406](https://github.com/bastani-inc/atomic/issues/3406)).
|
|
24
|
+
|
|
9
25
|
## [0.9.26-alpha.1] - 2026-10-01
|
|
10
26
|
|
|
11
27
|
### Fixed
|
|
@@ -5107,10 +5107,97 @@ function getDurableBackendProcessOwner() {
|
|
|
5107
5107
|
}
|
|
5108
5108
|
// dist/builtin/workflows/src/durable/dbos-admission.ts
|
|
5109
5109
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5110
|
+
|
|
5111
|
+
// dist/builtin/workflows/src/durable/dbos-database-diagnostics.ts
|
|
5112
|
+
function redactedDatabaseEndpoint(url) {
|
|
5113
|
+
try {
|
|
5114
|
+
const parsed = new URL(url);
|
|
5115
|
+
parsed.username = "";
|
|
5116
|
+
parsed.password = "";
|
|
5117
|
+
parsed.search = "";
|
|
5118
|
+
parsed.hash = "";
|
|
5119
|
+
return parsed.toString();
|
|
5120
|
+
} catch {
|
|
5121
|
+
return "unparseable PostgreSQL endpoint";
|
|
5122
|
+
}
|
|
5123
|
+
}
|
|
5124
|
+
function redactedDatabaseMessage(message, url) {
|
|
5125
|
+
let safe = message.replace(/postgres(?:ql)?:\/\/[^\s"'<>]+/gi, (value) => redactedDatabaseEndpoint(value));
|
|
5126
|
+
let configuredSecrets = [];
|
|
5127
|
+
if (url !== undefined) {
|
|
5128
|
+
try {
|
|
5129
|
+
const parsed = new URL(url);
|
|
5130
|
+
configuredSecrets = [parsed.username, parsed.password, ...parsed.searchParams.values()].flatMap((secret) => {
|
|
5131
|
+
try {
|
|
5132
|
+
return [secret, decodeURIComponent(secret)];
|
|
5133
|
+
} catch {
|
|
5134
|
+
return [secret];
|
|
5135
|
+
}
|
|
5136
|
+
}).filter((secret) => secret.length > 0);
|
|
5137
|
+
} catch {
|
|
5138
|
+
return "PostgreSQL diagnostic could not be safely redacted; check the configured endpoint.";
|
|
5139
|
+
}
|
|
5140
|
+
}
|
|
5141
|
+
safe = safe.replace(/\b(password|passwd|token|secret|sslpassword|user(?:name)?)\s*(?:([=:])\s*|((?:is|was)\s+)|\s+)(?:"([^"]*)"|'([^']*)'|([^\s,;]+))/gi, (match, key, separator, filler, doubleQuoted, singleQuoted, bare) => {
|
|
5142
|
+
const value = doubleQuoted ?? singleQuoted ?? bare ?? "";
|
|
5143
|
+
const isUserContext = /^user(?:name)?$/i.test(key);
|
|
5144
|
+
if (separator === undefined && !isUserContext && !configuredSecrets.includes(value))
|
|
5145
|
+
return match;
|
|
5146
|
+
const rendered = doubleQuoted !== undefined ? '"[redacted]"' : singleQuoted !== undefined ? "'[redacted]'" : "[redacted]";
|
|
5147
|
+
return `${key}${separator ?? " "}${filler ?? ""}${rendered}`;
|
|
5148
|
+
});
|
|
5149
|
+
for (const secret of new Set(configuredSecrets)) {
|
|
5150
|
+
if (secret.length < 4)
|
|
5151
|
+
continue;
|
|
5152
|
+
const escaped = secret.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
5153
|
+
const expression = new RegExp(`(?<![\\p{L}\\p{N}_\\[])${escaped}(?![\\p{L}\\p{N}_\\]])`, "gu");
|
|
5154
|
+
safe = safe.replace(expression, "[redacted]");
|
|
5155
|
+
}
|
|
5156
|
+
return safe;
|
|
5157
|
+
}
|
|
5158
|
+
function databaseDependencyMessage(message, diagnostics) {
|
|
5159
|
+
const safe = redactedDatabaseMessage(message, diagnostics?.url);
|
|
5160
|
+
if (diagnostics === undefined)
|
|
5161
|
+
return safe;
|
|
5162
|
+
const failure = diagnostics.failure === undefined ? "" : ` Last probe/recovery failure: ${redactedDatabaseMessage(diagnostics.failure, diagnostics.url)}`;
|
|
5163
|
+
return `${safe} Provider: ${diagnostics.provider}; endpoint: ${redactedDatabaseEndpoint(diagnostics.url)}.${failure}`;
|
|
5164
|
+
}
|
|
5165
|
+
|
|
5166
|
+
// dist/builtin/workflows/src/durable/dbos-process-owner.ts
|
|
5167
|
+
var DBOS_PROCESS_OWNER_KEY = Symbol.for("atomic-workflows/dbos-process-owner@1");
|
|
5168
|
+
function emptyOwner2() {
|
|
5169
|
+
return {
|
|
5170
|
+
version: 1,
|
|
5171
|
+
state: "uninitialized",
|
|
5172
|
+
configured: undefined,
|
|
5173
|
+
active: undefined,
|
|
5174
|
+
launchPromise: undefined,
|
|
5175
|
+
shutdownPromise: undefined,
|
|
5176
|
+
failure: undefined,
|
|
5177
|
+
wrappers: undefined,
|
|
5178
|
+
leases: new Set
|
|
5179
|
+
};
|
|
5180
|
+
}
|
|
5181
|
+
function ownerBag2() {
|
|
5182
|
+
return globalThis;
|
|
5183
|
+
}
|
|
5184
|
+
function getDbosProcessOwner() {
|
|
5185
|
+
const bag = ownerBag2();
|
|
5186
|
+
const existing = bag[DBOS_PROCESS_OWNER_KEY];
|
|
5187
|
+
if (existing !== undefined && existing.version === 1)
|
|
5188
|
+
return existing;
|
|
5189
|
+
const created = emptyOwner2();
|
|
5190
|
+
bag[DBOS_PROCESS_OWNER_KEY] = created;
|
|
5191
|
+
return created;
|
|
5192
|
+
}
|
|
5193
|
+
|
|
5194
|
+
// dist/builtin/workflows/src/durable/dbos-admission.ts
|
|
5110
5195
|
class DbosDependencyError extends Error {
|
|
5111
5196
|
code = "ATOMIC_DBOS_DEPENDENCY";
|
|
5112
|
-
|
|
5113
|
-
|
|
5197
|
+
admissionDetail;
|
|
5198
|
+
constructor(message = "Workflow database unavailable during admission. Restore PostgreSQL before retrying.", diagnostics = getDbosProcessOwner().databaseDiagnostics?.(), admissionDetail) {
|
|
5199
|
+
super(databaseDependencyMessage(message, diagnostics ?? undefined));
|
|
5200
|
+
this.admissionDetail = admissionDetail === undefined ? undefined : redactedDatabaseMessage(admissionDetail);
|
|
5114
5201
|
this.name = "DbosDependencyError";
|
|
5115
5202
|
}
|
|
5116
5203
|
}
|
|
@@ -5218,34 +5305,6 @@ var STATUS_RELATED_MESSAGE_REFINEMENT_CODES = new Set([
|
|
|
5218
5305
|
"quota_limited",
|
|
5219
5306
|
"cancelled"
|
|
5220
5307
|
]);
|
|
5221
|
-
// dist/builtin/workflows/src/durable/dbos-process-owner.ts
|
|
5222
|
-
var DBOS_PROCESS_OWNER_KEY = Symbol.for("atomic-workflows/dbos-process-owner@1");
|
|
5223
|
-
function emptyOwner2() {
|
|
5224
|
-
return {
|
|
5225
|
-
version: 1,
|
|
5226
|
-
state: "uninitialized",
|
|
5227
|
-
configured: undefined,
|
|
5228
|
-
active: undefined,
|
|
5229
|
-
launchPromise: undefined,
|
|
5230
|
-
shutdownPromise: undefined,
|
|
5231
|
-
failure: undefined,
|
|
5232
|
-
wrappers: undefined,
|
|
5233
|
-
leases: new Set
|
|
5234
|
-
};
|
|
5235
|
-
}
|
|
5236
|
-
function ownerBag2() {
|
|
5237
|
-
return globalThis;
|
|
5238
|
-
}
|
|
5239
|
-
function getDbosProcessOwner() {
|
|
5240
|
-
const bag = ownerBag2();
|
|
5241
|
-
const existing = bag[DBOS_PROCESS_OWNER_KEY];
|
|
5242
|
-
if (existing !== undefined && existing.version === 1)
|
|
5243
|
-
return existing;
|
|
5244
|
-
const created = emptyOwner2();
|
|
5245
|
-
bag[DBOS_PROCESS_OWNER_KEY] = created;
|
|
5246
|
-
return created;
|
|
5247
|
-
}
|
|
5248
|
-
|
|
5249
5308
|
// dist/builtin/workflows/src/durable/dbos-sdk-handle.ts
|
|
5250
5309
|
var ATOMIC_EXECUTOR_ID = `atomic-${process.pid.toString(36)}-${crypto.randomUUID().slice(0, 8)}`;
|
|
5251
5310
|
|
|
@@ -6321,6 +6380,7 @@ class PostgresHealth {
|
|
|
6321
6380
|
attempts = 0;
|
|
6322
6381
|
nextRecoveryAt = 0;
|
|
6323
6382
|
failure;
|
|
6383
|
+
healthySinceFailure = false;
|
|
6324
6384
|
revision = 0;
|
|
6325
6385
|
listeners = new Set;
|
|
6326
6386
|
constructor(operations) {
|
|
@@ -6329,6 +6389,18 @@ class PostgresHealth {
|
|
|
6329
6389
|
get lastFailure() {
|
|
6330
6390
|
return this.failure;
|
|
6331
6391
|
}
|
|
6392
|
+
get endpoint() {
|
|
6393
|
+
return this.operations.url?.();
|
|
6394
|
+
}
|
|
6395
|
+
retainFailure(error) {
|
|
6396
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
6397
|
+
const safe = redactedDatabaseMessage(message, this.endpoint);
|
|
6398
|
+
this.failure = new Error(safe);
|
|
6399
|
+
this.healthySinceFailure = false;
|
|
6400
|
+
}
|
|
6401
|
+
dependencyFailure(message) {
|
|
6402
|
+
return new DbosDependencyError(message, this.endpoint === undefined ? undefined : { provider: "managed", url: this.endpoint, failure: this.failure?.message });
|
|
6403
|
+
}
|
|
6332
6404
|
subscribe(listener) {
|
|
6333
6405
|
this.listeners.add(listener);
|
|
6334
6406
|
return () => this.listeners.delete(listener);
|
|
@@ -6351,12 +6423,15 @@ class PostgresHealth {
|
|
|
6351
6423
|
await this.operations.validate?.(client);
|
|
6352
6424
|
}
|
|
6353
6425
|
} catch (error) {
|
|
6354
|
-
this.
|
|
6426
|
+
this.retainFailure(error);
|
|
6355
6427
|
if (!isQueryReadTimeout(error)) {
|
|
6356
6428
|
this.invalidate();
|
|
6357
|
-
|
|
6429
|
+
if (this.endpoint === undefined)
|
|
6430
|
+
throw error;
|
|
6431
|
+
const failure = this.dependencyFailure("Managed PostgreSQL connection validation refused. Preserve its data and ownership records.");
|
|
6432
|
+
throw error instanceof DbosDependencyError ? failure : new Error(failure.message);
|
|
6358
6433
|
}
|
|
6359
|
-
throw
|
|
6434
|
+
throw this.dependencyFailure("Managed PostgreSQL did not answer a connection identity check in time.");
|
|
6360
6435
|
}
|
|
6361
6436
|
}
|
|
6362
6437
|
check() {
|
|
@@ -6397,7 +6472,7 @@ class PostgresHealth {
|
|
|
6397
6472
|
} catch (retryError) {
|
|
6398
6473
|
if (!isMonitoringConnectionFailure(retryError))
|
|
6399
6474
|
throw retryError;
|
|
6400
|
-
this.
|
|
6475
|
+
this.retainFailure(retryError);
|
|
6401
6476
|
return;
|
|
6402
6477
|
}
|
|
6403
6478
|
}
|
|
@@ -6412,6 +6487,7 @@ class PostgresHealth {
|
|
|
6412
6487
|
this.available = identity;
|
|
6413
6488
|
this.attempts = 0;
|
|
6414
6489
|
this.nextRecoveryAt = 0;
|
|
6490
|
+
this.healthySinceFailure = true;
|
|
6415
6491
|
return identity.url;
|
|
6416
6492
|
}
|
|
6417
6493
|
async refresh() {
|
|
@@ -6421,19 +6497,21 @@ class PostgresHealth {
|
|
|
6421
6497
|
return ready;
|
|
6422
6498
|
} catch (error) {
|
|
6423
6499
|
if (isQueryReadTimeout(error)) {
|
|
6424
|
-
this.
|
|
6425
|
-
throw this.
|
|
6500
|
+
this.retainFailure(new Error("Managed PostgreSQL did not answer a health check in time."));
|
|
6501
|
+
throw this.dependencyFailure("Managed PostgreSQL did not answer a health check in time.");
|
|
6426
6502
|
}
|
|
6427
|
-
this.
|
|
6503
|
+
this.retainFailure(error);
|
|
6428
6504
|
if (!(error instanceof Error && ("code" in error) && error.code === "53300"))
|
|
6429
6505
|
this.invalidate();
|
|
6430
|
-
throw error;
|
|
6506
|
+
throw this.endpoint === undefined ? error : this.dependencyFailure("Managed PostgreSQL recovery refused after a health probe failure. Preserve its data and ownership records.");
|
|
6507
|
+
}
|
|
6508
|
+
if (this.attempts === 0 && (this.failure === undefined || this.healthySinceFailure)) {
|
|
6509
|
+
this.retainFailure(new Error("Managed PostgreSQL failed its live health check."));
|
|
6510
|
+
this.healthySinceFailure = false;
|
|
6431
6511
|
}
|
|
6432
|
-
if (this.attempts === 0)
|
|
6433
|
-
this.failure = new DbosDependencyError("Managed PostgreSQL failed its live health check.");
|
|
6434
6512
|
this.invalidate();
|
|
6435
6513
|
if ((this.operations.now ?? Date.now)() < this.nextRecoveryAt)
|
|
6436
|
-
throw
|
|
6514
|
+
throw this.dependencyFailure("Managed Postgres recovery is cooling down after bounded attempts.");
|
|
6437
6515
|
while (!this.stopped && this.attempts < RECOVERY_ATTEMPTS) {
|
|
6438
6516
|
const attempt = this.attempts++;
|
|
6439
6517
|
if (attempt > 0)
|
|
@@ -6446,12 +6524,12 @@ class PostgresHealth {
|
|
|
6446
6524
|
if (ready !== undefined)
|
|
6447
6525
|
return ready;
|
|
6448
6526
|
} catch (error) {
|
|
6449
|
-
this.
|
|
6527
|
+
this.retainFailure(error);
|
|
6450
6528
|
}
|
|
6451
6529
|
}
|
|
6452
6530
|
this.attempts = 0;
|
|
6453
6531
|
this.nextRecoveryAt = (this.operations.now ?? Date.now)() + HEALTH_INTERVAL_MS;
|
|
6454
|
-
throw
|
|
6532
|
+
throw this.dependencyFailure("Managed Postgres is unavailable after bounded recovery. Preserve its data and ownership records.");
|
|
6455
6533
|
}
|
|
6456
6534
|
}
|
|
6457
6535
|
|
|
@@ -7106,6 +7184,8 @@ async function ensureCluster(options = {}) {
|
|
|
7106
7184
|
const server = current.server;
|
|
7107
7185
|
if (!server)
|
|
7108
7186
|
throw new Error("Managed Postgres published identity is missing.");
|
|
7187
|
+
if (managedPostmaster(current) === undefined)
|
|
7188
|
+
return;
|
|
7109
7189
|
if (!managedPostgresRuntimeHealthy(current, server.port)) {
|
|
7110
7190
|
verifyManagedPostmasterProcess(current, server);
|
|
7111
7191
|
return;
|
|
@@ -7122,6 +7202,7 @@ async function ensureCluster(options = {}) {
|
|
|
7122
7202
|
};
|
|
7123
7203
|
health = new PostgresHealth({
|
|
7124
7204
|
probe: () => inspect(),
|
|
7205
|
+
url: embeddedDbosSystemDatabaseUrl,
|
|
7125
7206
|
validate: async (client) => {
|
|
7126
7207
|
const identity = await inspect(async () => {
|
|
7127
7208
|
const query = { text: POSTGRES_IDENTITY_SQL, query_timeout: POSTGRES_HEALTH_QUERY_TIMEOUT_MS };
|
|
@@ -8353,10 +8434,10 @@ function recordPendingStageMessageDeliveries(messages, runId, messageId, records
|
|
|
8353
8434
|
if (index < 0)
|
|
8354
8435
|
return messages;
|
|
8355
8436
|
const entry = messages[index];
|
|
8356
|
-
const recorded = new Set((entry.deliveries ?? []).map((delivery) =>
|
|
8437
|
+
const recorded = new Set((entry.deliveries ?? []).map((delivery) => JSON.stringify([delivery.runId, delivery.stageId, delivery.sessionId, delivery.admission])));
|
|
8357
8438
|
const additions = [];
|
|
8358
8439
|
for (const record of records) {
|
|
8359
|
-
const key =
|
|
8440
|
+
const key = JSON.stringify([record.runId, record.stageId, record.sessionId, record.admission]);
|
|
8360
8441
|
if (recorded.has(key))
|
|
8361
8442
|
continue;
|
|
8362
8443
|
recorded.add(key);
|
|
@@ -8364,6 +8445,8 @@ function recordPendingStageMessageDeliveries(messages, runId, messageId, records
|
|
|
8364
8445
|
runId: record.runId,
|
|
8365
8446
|
stageId: record.stageId,
|
|
8366
8447
|
...record.stageName === undefined ? {} : { stageName: record.stageName },
|
|
8448
|
+
...record.sessionId === undefined ? {} : { sessionId: record.sessionId },
|
|
8449
|
+
...record.admission === undefined ? {} : { admission: record.admission },
|
|
8367
8450
|
deliveredAt
|
|
8368
8451
|
});
|
|
8369
8452
|
}
|
|
@@ -14,11 +14,11 @@ import {
|
|
|
14
14
|
import {
|
|
15
15
|
generate_and_filter_default
|
|
16
16
|
} from "./chunk-kb7s3gx2.js";
|
|
17
|
-
import"./chunk-
|
|
17
|
+
import"./chunk-613yaa53.js";
|
|
18
18
|
import"./chunk-z0d03ktm.js";
|
|
19
19
|
import {
|
|
20
20
|
goal_default
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-ea6nrbn3.js";
|
|
22
22
|
import {
|
|
23
23
|
open_claude_design_default
|
|
24
24
|
} from "./chunk-nkj4qhj6.js";
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
} from "./chunk-94f8zfz1.js";
|
|
28
28
|
import {
|
|
29
29
|
ralph_default
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-6kqrk0pf.js";
|
|
31
31
|
import {
|
|
32
32
|
tournament_default
|
|
33
33
|
} from "./chunk-wf876n16.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/workflows",
|
|
3
|
-
"version": "0.9.26-alpha.
|
|
3
|
+
"version": "0.9.26-alpha.5",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Atomic extension for multi-stage workflow authoring and execution.",
|
|
6
6
|
"contributors": [
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
87
|
"@bastani/atomic": "*",
|
|
88
|
-
"@earendil-works/pi-tui": "^1.0.
|
|
88
|
+
"@earendil-works/pi-tui": "^1.0.1",
|
|
89
89
|
"typebox": "*"
|
|
90
90
|
},
|
|
91
91
|
"peerDependenciesMeta": {
|