@bastani/atomic 0.9.16-alpha.7 → 0.9.16-alpha.9
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 +25 -0
- package/dist/builtin/intercom/CHANGELOG.md +6 -0
- package/dist/builtin/intercom/README.md +4 -4
- package/dist/builtin/intercom/broker/broker.ts +617 -22
- package/dist/builtin/intercom/broker/client-message-validation.ts +9 -0
- package/dist/builtin/intercom/broker/client.ts +200 -10
- package/dist/builtin/intercom/broker/pending-send-registry.ts +4 -0
- package/dist/builtin/intercom/broker/send-handler.ts +90 -36
- package/dist/builtin/intercom/broker/send-signature.ts +20 -8
- package/dist/builtin/intercom/group.ts +85 -0
- package/dist/builtin/intercom/index.bundle.mjs +746 -55
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/intercom/session-target.ts +54 -0
- package/dist/builtin/intercom/skills/intercom/SKILL.md +18 -3
- package/dist/builtin/intercom/source-ownership.ts +31 -0
- package/dist/builtin/intercom/types.ts +115 -0
- package/dist/builtin/mcp/index.bundle.mjs +175 -37
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/src/extension/index.bundle.mjs +239 -53
- package/dist/builtin/web-access/index.bundle.mjs +175 -37
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/CHANGELOG.md +15 -0
- package/dist/builtin/workflows/README.md +40 -37
- package/dist/builtin/workflows/builtin/adversarial-verification.js +13 -0
- package/dist/builtin/workflows/builtin/{shared-prompts.ts → chunk-0x6e303p.js} +133 -154
- package/dist/builtin/workflows/builtin/chunk-17zk6ffd.js +69794 -0
- package/dist/builtin/workflows/builtin/chunk-29wrp38a.js +199 -0
- package/dist/builtin/workflows/builtin/chunk-2dqb5s2q.js +602 -0
- package/dist/builtin/workflows/builtin/chunk-4febxsv4.js +264 -0
- package/dist/builtin/workflows/builtin/chunk-5wgwscd0.js +4 -0
- package/dist/builtin/workflows/builtin/chunk-6fqs7c01.js +155 -0
- package/dist/builtin/workflows/builtin/chunk-7430zyas.js +126 -0
- package/dist/builtin/workflows/builtin/chunk-7at6dnkr.js +33 -0
- package/dist/builtin/workflows/builtin/chunk-82ha8p41.js +175 -0
- package/dist/builtin/workflows/builtin/chunk-8v8wmb7z.js +529 -0
- package/dist/builtin/workflows/builtin/chunk-bfkmzv9h.js +156 -0
- package/dist/builtin/workflows/builtin/chunk-c53y8bdh.js +345 -0
- package/dist/builtin/workflows/builtin/chunk-cg9tmks0.js +206 -0
- package/dist/builtin/workflows/builtin/chunk-h5e65g7g.js +1080 -0
- package/dist/builtin/workflows/builtin/chunk-hzzn6adg.js +221 -0
- package/dist/builtin/workflows/builtin/chunk-nqr34qp3.js +1061 -0
- package/dist/builtin/workflows/builtin/chunk-qe6bfpbd.js +1207 -0
- package/dist/builtin/workflows/builtin/chunk-qwzvgxnq.js +404 -0
- package/dist/builtin/workflows/builtin/chunk-qx2ptjs3.js +215 -0
- package/dist/builtin/workflows/builtin/chunk-rbnj9621.js +2447 -0
- package/dist/builtin/workflows/builtin/chunk-wpckd35c.js +12 -0
- package/dist/builtin/workflows/builtin/chunk-x2ghn0je.js +4110 -0
- package/dist/builtin/workflows/builtin/classify-and-act.js +12 -0
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +10 -0
- package/dist/builtin/workflows/builtin/generate-and-filter.js +12 -0
- package/dist/builtin/workflows/builtin/goal.js +16 -0
- package/dist/builtin/workflows/builtin/index.js +49 -0
- package/dist/builtin/workflows/builtin/loop-until-done.js +12 -0
- package/dist/builtin/workflows/builtin/open-claude-design.js +11 -0
- package/dist/builtin/workflows/builtin/ralph.js +16 -0
- package/dist/builtin/workflows/builtin/steering-context.d.ts +6 -0
- package/dist/builtin/workflows/builtin/steering-context.js +7 -0
- package/dist/builtin/workflows/builtin/tournament.js +13 -0
- package/dist/builtin/workflows/package.json +10 -7
- package/dist/builtin/workflows/src/authoring/typebox-defaults.d.ts +41 -0
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +1294 -430
- package/dist/builtin/workflows/src/{index.bundle.mjs → index.js} +1022 -429
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +403 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +327 -0
- package/dist/builtin/workflows/src/shared/budget.d.ts +67 -0
- package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +60 -0
- package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.d.ts +21 -0
- package/dist/core/agent-session-custom-message-commit.d.ts.map +1 -1
- package/dist/core/agent-session-custom-message-commit.js +12 -5
- package/dist/core/agent-session-custom-message-commit.js.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.js +2 -0
- package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +2 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +2 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +4 -0
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/builtin-install-layout.d.ts +1 -1
- package/dist/core/builtin-install-layout.d.ts.map +1 -1
- package/dist/core/builtin-install-layout.js +1 -1
- package/dist/core/builtin-install-layout.js.map +1 -1
- package/dist/core/codex-fast-mode.d.ts +10 -7
- package/dist/core/codex-fast-mode.d.ts.map +1 -1
- package/dist/core/codex-fast-mode.js +31 -13
- package/dist/core/codex-fast-mode.js.map +1 -1
- package/dist/core/extensions/agent-events.d.ts +15 -0
- package/dist/core/extensions/agent-events.d.ts.map +1 -1
- package/dist/core/extensions/agent-events.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 +35 -0
- 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/event-types.d.ts +2 -2
- package/dist/core/extensions/event-types.d.ts.map +1 -1
- package/dist/core/extensions/event-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-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +6 -1
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +6 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +65 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +4 -0
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +1 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js +8 -0
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +5 -5
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-storage.d.ts +2 -0
- package/dist/core/session-manager-storage.d.ts.map +1 -1
- package/dist/core/session-manager-storage.js +4 -2
- package/dist/core/session-manager-storage.js.map +1 -1
- package/dist/core/slash-commands.js +1 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/workflow-stage-admission.d.ts +6 -1
- package/dist/core/workflow-stage-admission.d.ts.map +1 -1
- package/dist/core/workflow-stage-admission.js +8 -9
- package/dist/core/workflow-stage-admission.js.map +1 -1
- package/dist/index-extensions.d.ts +1 -1
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +1 -1
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts +4 -0
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +69 -10
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/modes/rpc/rpc-client-api.d.ts +18 -2
- package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client-api.js +33 -5
- package/dist/modes/rpc/rpc-client-api.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +8 -4
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +13 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/docs/extensions.md +19 -0
- package/docs/intercom.md +15 -6
- package/docs/packages.md +2 -2
- package/docs/providers.md +8 -3
- package/docs/quickstart.md +2 -2
- package/docs/rpc.md +21 -4
- package/docs/settings.md +6 -4
- package/docs/subagents.md +1 -1
- package/docs/usage.md +1 -1
- package/docs/workflows.md +108 -239
- package/npm-shrinkwrap.json +32 -32
- package/package.json +9 -13
- package/dist/builtin/workflows/ambient.d.ts +0 -61
- package/dist/builtin/workflows/builtin/adversarial-verification-prompts.ts +0 -26
- package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +0 -391
- package/dist/builtin/workflows/builtin/adversarial-verification.ts +0 -34
- package/dist/builtin/workflows/builtin/classify-and-act-prompts.ts +0 -14
- package/dist/builtin/workflows/builtin/classify-and-act-runner.ts +0 -108
- package/dist/builtin/workflows/builtin/classify-and-act.ts +0 -40
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize-prompts.ts +0 -14
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize-runner.ts +0 -96
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +0 -37
- package/dist/builtin/workflows/builtin/generate-and-filter-prompts.ts +0 -41
- package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +0 -90
- package/dist/builtin/workflows/builtin/generate-and-filter.ts +0 -31
- package/dist/builtin/workflows/builtin/goal-artifacts.ts +0 -64
- package/dist/builtin/workflows/builtin/goal-convergence.ts +0 -87
- package/dist/builtin/workflows/builtin/goal-ledger.ts +0 -139
- package/dist/builtin/workflows/builtin/goal-models.ts +0 -72
- package/dist/builtin/workflows/builtin/goal-orchestrator-prompts.ts +0 -94
- package/dist/builtin/workflows/builtin/goal-prompts.ts +0 -217
- package/dist/builtin/workflows/builtin/goal-reducer.ts +0 -176
- package/dist/builtin/workflows/builtin/goal-reports.ts +0 -76
- package/dist/builtin/workflows/builtin/goal-reverify.ts +0 -305
- package/dist/builtin/workflows/builtin/goal-review.ts +0 -139
- package/dist/builtin/workflows/builtin/goal-runner.ts +0 -504
- package/dist/builtin/workflows/builtin/goal-schemas.ts +0 -89
- package/dist/builtin/workflows/builtin/goal-types.ts +0 -164
- package/dist/builtin/workflows/builtin/goal.ts +0 -78
- package/dist/builtin/workflows/builtin/index.ts +0 -16
- package/dist/builtin/workflows/builtin/loop-until-done-prompts.ts +0 -87
- package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +0 -282
- package/dist/builtin/workflows/builtin/loop-until-done.ts +0 -51
- package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +0 -305
- package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +0 -337
- package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +0 -347
- package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +0 -313
- package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -311
- package/dist/builtin/workflows/builtin/open-claude-design.ts +0 -57
- package/dist/builtin/workflows/builtin/pattern-artifact-root.ts +0 -28
- package/dist/builtin/workflows/builtin/progress-scoring.ts +0 -230
- package/dist/builtin/workflows/builtin/ralph-core.ts +0 -449
- package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +0 -100
- package/dist/builtin/workflows/builtin/ralph-models.ts +0 -183
- package/dist/builtin/workflows/builtin/ralph-review-gate.ts +0 -103
- package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +0 -104
- package/dist/builtin/workflows/builtin/ralph-runner.ts +0 -459
- package/dist/builtin/workflows/builtin/ralph.ts +0 -82
- package/dist/builtin/workflows/builtin/review-convergence.ts +0 -229
- package/dist/builtin/workflows/builtin/selection-math.ts +0 -156
- package/dist/builtin/workflows/builtin/steering-context.ts +0 -51
- package/dist/builtin/workflows/builtin/tournament-prompts.ts +0 -70
- package/dist/builtin/workflows/builtin/tournament-runner.ts +0 -400
- package/dist/builtin/workflows/builtin/tournament.ts +0 -73
- package/dist/builtin/workflows/builtin/verification-criteria.ts +0 -330
- package/dist/builtin/workflows/builtin/verification-prompts.ts +0 -206
- package/dist/builtin/workflows/builtin/verification-usage.ts +0 -44
|
@@ -3860,10 +3860,10 @@ function hasAssistantMessage(entries) {
|
|
|
3860
3860
|
return entries.some((entry) => entry.type === "message" && entry.message.role === "assistant");
|
|
3861
3861
|
}
|
|
3862
3862
|
function persistAppendedEntry(filePath, entries, entry, flushed) {
|
|
3863
|
-
if (!hasAssistantMessage(entries))
|
|
3864
|
-
return false;
|
|
3865
3863
|
if (flushed)
|
|
3866
3864
|
appendSessionEntry(filePath, entry);
|
|
3865
|
+
else if (!hasAssistantMessage(entries))
|
|
3866
|
+
return false;
|
|
3867
3867
|
else
|
|
3868
3868
|
appendSessionEntries(filePath, entries);
|
|
3869
3869
|
return true;
|
|
@@ -9931,6 +9931,8 @@ function appendDurableDisplayCard(session, message, delivery) {
|
|
|
9931
9931
|
const card = { ...message, excludeFromContext: true };
|
|
9932
9932
|
const admitted = message;
|
|
9933
9933
|
const intentEntryId = session.sessionManager.appendCustomMessageEntry(card.customType, card.content, card.display, card.details, true, { delivery }, admitted.stageAdmissionKey);
|
|
9934
|
+
if (admitted.stageAdmissionKey !== undefined)
|
|
9935
|
+
session.sessionManager.flush();
|
|
9934
9936
|
session.agent.state.messages.push(card);
|
|
9935
9937
|
return { card, intentEntryId };
|
|
9936
9938
|
}
|
|
@@ -10156,12 +10158,17 @@ var init_agent_session_persistent_custom_messages = __esm(() => {
|
|
|
10156
10158
|
});
|
|
10157
10159
|
|
|
10158
10160
|
// src/core/agent-session-custom-message-commit.ts
|
|
10161
|
+
function appendDurableStageAdmission(session, message) {
|
|
10162
|
+
session._appendCustomMessage(message);
|
|
10163
|
+
if (message.stageAdmissionKey !== undefined)
|
|
10164
|
+
session.sessionManager?.flush();
|
|
10165
|
+
}
|
|
10159
10166
|
async function commitAdmittedCustomMessage(session, appMessage, options) {
|
|
10160
10167
|
const owner = resolveWorkflowStageDeliveryTarget(session);
|
|
10161
10168
|
if (owner !== session)
|
|
10162
10169
|
return commitAdmittedCustomMessage(owner, appMessage, options);
|
|
10163
10170
|
const self = session;
|
|
10164
|
-
const useProtectedReconciliation = options?.persistWhenStreaming === true && options.triggerTurn === true
|
|
10171
|
+
const useProtectedReconciliation = options?.persistWhenStreaming === true && options.excludeFromContext !== true && (options.triggerTurn === true || options.stageAdmissionKey !== undefined);
|
|
10165
10172
|
if (options?.deliverAs === "nextTurn") {
|
|
10166
10173
|
self._pendingNextTurnMessages.push(appMessage);
|
|
10167
10174
|
} else if (self._queuedMessagesPaused) {
|
|
@@ -10175,20 +10182,20 @@ async function commitAdmittedCustomMessage(session, appMessage, options) {
|
|
|
10175
10182
|
} else if (self.isStreaming) {
|
|
10176
10183
|
self._pendingCustomMessages.push(appMessage);
|
|
10177
10184
|
} else {
|
|
10178
|
-
self
|
|
10185
|
+
appendDurableStageAdmission(self, appMessage);
|
|
10179
10186
|
}
|
|
10180
10187
|
} else if (options?.deliverAs === "interrupt" && options.triggerTurn) {
|
|
10181
10188
|
const interrupt = self._enqueueInterruptCustomMessage(appMessage, options);
|
|
10182
10189
|
self._workflowStageAdmission?.trackAdmittedWork(interrupt);
|
|
10183
10190
|
interrupt.catch(() => {});
|
|
10184
10191
|
} else if (self.isStreaming && options?.excludeFromContext === true && options.triggerTurn !== true && options.deliverAs === undefined) {
|
|
10185
|
-
self
|
|
10192
|
+
appendDurableStageAdmission(self, appMessage);
|
|
10186
10193
|
} else if (self.isStreaming && options?.triggerTurn === false) {
|
|
10187
10194
|
self._pendingCustomMessages.push(appMessage);
|
|
10188
10195
|
} else if (self.isStreaming && useProtectedReconciliation) {
|
|
10189
10196
|
await queueProtectedStreamingCustomMessage(self, appMessage, options?.deliverAs === "followUp" ? "followUp" : "steer");
|
|
10190
10197
|
} else if (self.isStreaming && options?.persistWhenStreaming === true) {
|
|
10191
|
-
self
|
|
10198
|
+
appendDurableStageAdmission(self, appMessage);
|
|
10192
10199
|
} else if (self.isStreaming && options?.triggerTurn !== false) {
|
|
10193
10200
|
self._queueAgentMessage(appMessage, options?.deliverAs === "followUp" ? "followUp" : "steer");
|
|
10194
10201
|
} else if (options?.triggerTurn) {
|
|
@@ -10211,7 +10218,7 @@ async function commitAdmittedCustomMessage(session, appMessage, options) {
|
|
|
10211
10218
|
self._continueQueuedAgentMessages().catch(() => {});
|
|
10212
10219
|
}
|
|
10213
10220
|
} else {
|
|
10214
|
-
self
|
|
10221
|
+
appendDurableStageAdmission(self, appMessage);
|
|
10215
10222
|
}
|
|
10216
10223
|
}
|
|
10217
10224
|
function _commitAdmittedCustomMessage(appMessage, options) {
|
|
@@ -12235,6 +12242,8 @@ class ExtensionRunner {
|
|
|
12235
12242
|
shortcutDiagnostics = [];
|
|
12236
12243
|
commandDiagnostics = [];
|
|
12237
12244
|
staleMessage;
|
|
12245
|
+
uiPromptBinding = 0;
|
|
12246
|
+
activeUIPrompt;
|
|
12238
12247
|
constructor(extensions, runtime, cwd, sessionManager, modelRegistry, orchestrationContext, subagentPolicy) {
|
|
12239
12248
|
this.extensions = extensions;
|
|
12240
12249
|
this.runtime = runtime;
|
|
@@ -12329,9 +12338,71 @@ class ExtensionRunner {
|
|
|
12329
12338
|
this.reloadHandler = async () => {};
|
|
12330
12339
|
}
|
|
12331
12340
|
setUIContext(uiContext, mode = "print") {
|
|
12332
|
-
this.
|
|
12341
|
+
this.endActiveUIPrompt();
|
|
12342
|
+
const binding = ++this.uiPromptBinding;
|
|
12343
|
+
this.uiContext = uiContext ? this.wrapUIPromptContext(uiContext, binding) : noOpUIContext;
|
|
12333
12344
|
this.mode = mode;
|
|
12334
12345
|
}
|
|
12346
|
+
wrapUIPromptContext(ui, binding) {
|
|
12347
|
+
return {
|
|
12348
|
+
...ui,
|
|
12349
|
+
select: (title, options, opts) => this.withUIPrompt(binding, "select", title, () => ui.select(title, options, opts)),
|
|
12350
|
+
confirm: (title, message, opts) => this.withUIPrompt(binding, "confirm", title, () => ui.confirm(title, message, opts)),
|
|
12351
|
+
input: (title, placeholder, opts) => this.withUIPrompt(binding, "input", title, () => ui.input(title, placeholder, opts)),
|
|
12352
|
+
editor: (title, prefill, opts) => this.withUIPrompt(binding, "editor", title, () => ui.editor(title, prefill, opts)),
|
|
12353
|
+
custom: (factory, options) => this.withUIPrompt(binding, "custom", undefined, () => ui.custom(factory, options))
|
|
12354
|
+
};
|
|
12355
|
+
}
|
|
12356
|
+
withUIPrompt(binding, kind, title, run) {
|
|
12357
|
+
if (binding !== this.uiPromptBinding)
|
|
12358
|
+
return run();
|
|
12359
|
+
let prompt = this.activeUIPrompt;
|
|
12360
|
+
if (!prompt) {
|
|
12361
|
+
prompt = { depth: 0, kind, title };
|
|
12362
|
+
this.activeUIPrompt = prompt;
|
|
12363
|
+
this.emitUIPromptEvent({
|
|
12364
|
+
type: "ui_prompt_start",
|
|
12365
|
+
reason: "ui_prompt",
|
|
12366
|
+
kind,
|
|
12367
|
+
...title === undefined ? {} : { title }
|
|
12368
|
+
});
|
|
12369
|
+
}
|
|
12370
|
+
prompt.depth += 1;
|
|
12371
|
+
let finished = false;
|
|
12372
|
+
const finish = () => {
|
|
12373
|
+
if (finished)
|
|
12374
|
+
return;
|
|
12375
|
+
finished = true;
|
|
12376
|
+
if (this.activeUIPrompt !== prompt)
|
|
12377
|
+
return;
|
|
12378
|
+
prompt.depth -= 1;
|
|
12379
|
+
if (prompt.depth === 0)
|
|
12380
|
+
this.endActiveUIPrompt(prompt);
|
|
12381
|
+
};
|
|
12382
|
+
try {
|
|
12383
|
+
return run().finally(finish);
|
|
12384
|
+
} catch (error) {
|
|
12385
|
+
finish();
|
|
12386
|
+
throw error;
|
|
12387
|
+
}
|
|
12388
|
+
}
|
|
12389
|
+
endActiveUIPrompt(prompt = this.activeUIPrompt) {
|
|
12390
|
+
if (!prompt || this.activeUIPrompt !== prompt)
|
|
12391
|
+
return;
|
|
12392
|
+
this.activeUIPrompt = undefined;
|
|
12393
|
+
prompt.depth = 0;
|
|
12394
|
+
this.emitUIPromptEvent({
|
|
12395
|
+
type: "ui_prompt_end",
|
|
12396
|
+
reason: "ui_prompt",
|
|
12397
|
+
kind: prompt.kind,
|
|
12398
|
+
...prompt.title === undefined ? {} : { title: prompt.title }
|
|
12399
|
+
});
|
|
12400
|
+
}
|
|
12401
|
+
emitUIPromptEvent(event) {
|
|
12402
|
+
queueMicrotask(() => {
|
|
12403
|
+
this.emit(event);
|
|
12404
|
+
});
|
|
12405
|
+
}
|
|
12335
12406
|
getUIContext() {
|
|
12336
12407
|
return this.uiContext;
|
|
12337
12408
|
}
|
|
@@ -21613,11 +21684,20 @@ import {
|
|
|
21613
21684
|
function isCodexFastModeSupportedProvider(provider) {
|
|
21614
21685
|
return provider === "openai" || provider === "openai-codex";
|
|
21615
21686
|
}
|
|
21616
|
-
function
|
|
21617
|
-
return
|
|
21687
|
+
function isGitHubCopilotModel(model) {
|
|
21688
|
+
return model.provider === "github-copilot";
|
|
21689
|
+
}
|
|
21690
|
+
function isGitHubCopilotFastModeSupportedModel(model, credential) {
|
|
21691
|
+
if (!isGitHubCopilotModel(model) || credential?.type !== "oauth")
|
|
21692
|
+
return false;
|
|
21693
|
+
const fastModelIds = credential.fastModelIds;
|
|
21694
|
+
return Array.isArray(fastModelIds) && fastModelIds.every((modelId) => typeof modelId === "string") && fastModelIds.includes(`${model.id}-fast`);
|
|
21695
|
+
}
|
|
21696
|
+
function isCodexFastModeSupportedModel(model, copilotCredential) {
|
|
21697
|
+
return isCodexFastModeSupportedProvider(model.provider) || model.api === "openai-codex-responses" || model.id !== undefined && isGitHubCopilotFastModeSupportedModel({ provider: model.provider, id: model.id }, copilotCredential);
|
|
21618
21698
|
}
|
|
21619
|
-
function hasSupportedCodexFastModeModel(models) {
|
|
21620
|
-
return models.some(isCodexFastModeSupportedModel);
|
|
21699
|
+
function hasSupportedCodexFastModeModel(models, copilotCredential) {
|
|
21700
|
+
return models.some((model) => isCodexFastModeSupportedModel(model, copilotCredential));
|
|
21621
21701
|
}
|
|
21622
21702
|
function isWorkflowStageOrchestrationContext(context) {
|
|
21623
21703
|
return context?.kind === "workflow-stage";
|
|
@@ -21628,11 +21708,11 @@ function getCodexFastModeScope(context) {
|
|
|
21628
21708
|
function isCodexFastModeEnabledForScope(settings, scope) {
|
|
21629
21709
|
return settings[scope];
|
|
21630
21710
|
}
|
|
21631
|
-
function shouldApplyCodexFastModeForScope(model, settings, scope) {
|
|
21632
|
-
return isCodexFastModeSupportedModel(model) && isCodexFastModeEnabledForScope(settings, scope);
|
|
21711
|
+
function shouldApplyCodexFastModeForScope(model, settings, scope, copilotCredential) {
|
|
21712
|
+
return isCodexFastModeSupportedModel(model, copilotCredential) && isCodexFastModeEnabledForScope(settings, scope);
|
|
21633
21713
|
}
|
|
21634
|
-
function shouldApplyCodexFastMode(model, settings, context) {
|
|
21635
|
-
return shouldApplyCodexFastModeForScope(model, settings, getCodexFastModeScope(context));
|
|
21714
|
+
function shouldApplyCodexFastMode(model, settings, context, copilotCredential) {
|
|
21715
|
+
return shouldApplyCodexFastModeForScope(model, settings, getCodexFastModeScope(context), copilotCredential);
|
|
21636
21716
|
}
|
|
21637
21717
|
function formatCodexFastModeModelLabel(modelName, enabled) {
|
|
21638
21718
|
return enabled ? `${modelName} fast` : modelName;
|
|
@@ -21773,7 +21853,7 @@ class FooterComponent {
|
|
|
21773
21853
|
pwd += ` • ${sessionName}`;
|
|
21774
21854
|
const modelName = state.model?.id || "no-model";
|
|
21775
21855
|
const fastModeSettings = this.session.settingsManager.getCodexFastModeSettings();
|
|
21776
|
-
const fastModeEnabled = state.model ? shouldApplyCodexFastMode(state.model, fastModeSettings, this.session.orchestrationContext) : false;
|
|
21856
|
+
const fastModeEnabled = state.model ? shouldApplyCodexFastMode(state.model, fastModeSettings, this.session.orchestrationContext, this.session.modelRuntime.getCredentialSnapshot?.("github-copilot")) : false;
|
|
21777
21857
|
let modelLabel2 = modelName;
|
|
21778
21858
|
if (state.model?.reasoning) {
|
|
21779
21859
|
const thinkingLevel = state.thinkingLevel || "off";
|
|
@@ -39361,14 +39441,18 @@ import { AsyncLocalStorage } from "node:async_hooks";
|
|
|
39361
39441
|
|
|
39362
39442
|
class WorkflowStageAdmissionBoundary {
|
|
39363
39443
|
open = true;
|
|
39364
|
-
completed
|
|
39444
|
+
completed;
|
|
39365
39445
|
inFlight = new Map;
|
|
39366
39446
|
pending = new Set;
|
|
39367
39447
|
invocationContext = new AsyncLocalStorage;
|
|
39368
39448
|
closePromise;
|
|
39369
39449
|
drainAdmittedWork;
|
|
39370
|
-
constructor(drainAdmittedWork =
|
|
39371
|
-
this.drainAdmittedWork = drainAdmittedWork;
|
|
39450
|
+
constructor(drainAdmittedWork = undefined, completedKeys = []) {
|
|
39451
|
+
this.drainAdmittedWork = drainAdmittedWork ?? (async () => {});
|
|
39452
|
+
this.completed = new Set(completedKeys);
|
|
39453
|
+
}
|
|
39454
|
+
static restore(entries, drainAdmittedWork) {
|
|
39455
|
+
return new WorkflowStageAdmissionBoundary(drainAdmittedWork, Array.from(entries).flatMap((entry) => entry.type === "custom_message" && typeof entry.stageAdmissionKey === "string" ? [entry.stageAdmissionKey] : []));
|
|
39372
39456
|
}
|
|
39373
39457
|
admit(key, deliver, routeLate) {
|
|
39374
39458
|
if (key !== undefined) {
|
|
@@ -39607,7 +39691,7 @@ class AgentSessionBase {
|
|
|
39607
39691
|
this._subagentPolicy = config.subagentPolicy;
|
|
39608
39692
|
this._systemPromptTransform = config.systemPromptTransform;
|
|
39609
39693
|
const stageContext = config.orchestrationContext?.kind === "workflow-stage" ? config.orchestrationContext : undefined;
|
|
39610
|
-
this._workflowStageAdmission = stageContext?.messageAdmission?.boundary ?? (stageContext ?
|
|
39694
|
+
this._workflowStageAdmission = stageContext?.messageAdmission?.boundary ?? (stageContext ? WorkflowStageAdmissionBoundary.restore(this.sessionManager.getBranch()) : undefined);
|
|
39611
39695
|
if (this._workflowStageAdmission && stageContext && stageContext.messageAdmission === undefined) {
|
|
39612
39696
|
stageContext.messageAdmission = {
|
|
39613
39697
|
boundary: this._workflowStageAdmission,
|
|
@@ -46559,6 +46643,31 @@ class RemoteQueuePause {
|
|
|
46559
46643
|
var init_remote_queue_pause = () => {};
|
|
46560
46644
|
|
|
46561
46645
|
// src/modes/interactive-engine/isolated-runtime.ts
|
|
46646
|
+
import { clampThinkingLevel as clampThinkingLevel5 } from "@bastani/pi-ai/compat";
|
|
46647
|
+
function applyPersistedModelDefault(session, model, alreadyInScope) {
|
|
46648
|
+
session.settingsManager.setDefaultModelAndProvider(model.provider, model.id);
|
|
46649
|
+
if (alreadyInScope || session.scopedModels.length === 0)
|
|
46650
|
+
return;
|
|
46651
|
+
const enabledModels = session.settingsManager.getEnabledModels();
|
|
46652
|
+
if (!enabledModels?.length)
|
|
46653
|
+
return;
|
|
46654
|
+
const modelReference = `${model.provider}/${model.id}`;
|
|
46655
|
+
if (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase()))
|
|
46656
|
+
return;
|
|
46657
|
+
session.settingsManager.setEnabledModels([...enabledModels, modelReference]);
|
|
46658
|
+
}
|
|
46659
|
+
function thinkingPersistTarget(result) {
|
|
46660
|
+
if (!result.provider || !result.modelId)
|
|
46661
|
+
return;
|
|
46662
|
+
return { provider: result.provider, modelId: result.modelId };
|
|
46663
|
+
}
|
|
46664
|
+
function applyPersistedThinkingDefault(session, level, target) {
|
|
46665
|
+
if (target) {
|
|
46666
|
+
session.settingsManager.setModelThinkingLevel(target.provider, target.modelId, level);
|
|
46667
|
+
return;
|
|
46668
|
+
}
|
|
46669
|
+
session.settingsManager.setDefaultThinkingLevel(level);
|
|
46670
|
+
}
|
|
46562
46671
|
var IsolatedInteractiveRuntime;
|
|
46563
46672
|
var init_isolated_runtime = __esm(() => {
|
|
46564
46673
|
init_agent_session_runtime();
|
|
@@ -46577,6 +46686,7 @@ var init_isolated_runtime = __esm(() => {
|
|
|
46577
46686
|
steeringMessages = [];
|
|
46578
46687
|
followUpMessages = [];
|
|
46579
46688
|
queueUpdateGeneration = 0;
|
|
46689
|
+
thinkingEpoch = 0;
|
|
46580
46690
|
pendingQueueClear;
|
|
46581
46691
|
engineCallbackActive = false;
|
|
46582
46692
|
queuePause;
|
|
@@ -46941,43 +47051,56 @@ var init_isolated_runtime = __esm(() => {
|
|
|
46941
47051
|
},
|
|
46942
47052
|
setModel: {
|
|
46943
47053
|
configurable: true,
|
|
46944
|
-
value: async (model) => {
|
|
46945
|
-
const selected = await this.client.setModel(model.provider, model.id);
|
|
46946
|
-
|
|
47054
|
+
value: async (model, options) => {
|
|
47055
|
+
const selected = await this.client.setModel(model.provider, model.id, options);
|
|
47056
|
+
const nextModel = session.modelRuntime.getModel(selected.provider, selected.id) ?? model;
|
|
47057
|
+
session.agent.state.model = nextModel;
|
|
46947
47058
|
this.resolveModelFallback();
|
|
47059
|
+
if (options?.persist === true)
|
|
47060
|
+
await this.syncPersistedModelCatalog(session, nextModel);
|
|
46948
47061
|
}
|
|
46949
47062
|
},
|
|
46950
47063
|
setThinkingLevel: {
|
|
46951
47064
|
configurable: true,
|
|
46952
|
-
value: (level) => {
|
|
46953
|
-
|
|
46954
|
-
|
|
47065
|
+
value: (level, options) => {
|
|
47066
|
+
const availableLevels = session.getAvailableThinkingLevels();
|
|
47067
|
+
const effectiveLevel = availableLevels.includes(level) ? level : session.model ? clampThinkingLevel5(session.model, level) : "off";
|
|
47068
|
+
session.agent.state.thinkingLevel = effectiveLevel;
|
|
47069
|
+
const epoch = ++this.thinkingEpoch;
|
|
47070
|
+
this.dispatchBestEffort("set thinking level", this.client.setThinkingLevelAck(level, options).then((result) => {
|
|
47071
|
+
this.applyThinkingAck(session, epoch, result, options?.persist === true);
|
|
47072
|
+
}));
|
|
46955
47073
|
}
|
|
46956
47074
|
},
|
|
46957
47075
|
cycleModel: {
|
|
46958
47076
|
configurable: true,
|
|
46959
|
-
value: async (direction) => {
|
|
47077
|
+
value: async (direction, options) => {
|
|
46960
47078
|
const previousModel = session.model;
|
|
46961
|
-
const result = await this.client.cycleModel(direction);
|
|
47079
|
+
const result = await this.client.cycleModel(direction, options);
|
|
46962
47080
|
if (!result)
|
|
46963
47081
|
return;
|
|
46964
47082
|
const model = session.modelRuntime.getModel(result.model.provider, result.model.id) ?? result.model;
|
|
46965
47083
|
session.agent.state.model = model;
|
|
46966
47084
|
session.agent.state.thinkingLevel = result.thinkingLevel;
|
|
46967
47085
|
this.resolveModelFallbackAfterExplicitModelSelection(previousModel, model);
|
|
47086
|
+
if (options?.persist === true)
|
|
47087
|
+
await this.syncPersistedModelCatalog(session, model);
|
|
46968
47088
|
return { ...result, model };
|
|
46969
47089
|
}
|
|
46970
47090
|
},
|
|
46971
47091
|
cycleThinkingLevel: {
|
|
46972
47092
|
configurable: true,
|
|
46973
|
-
value: () => {
|
|
47093
|
+
value: (options) => {
|
|
46974
47094
|
const levels = session.getAvailableThinkingLevels();
|
|
46975
47095
|
if (levels.length <= 1)
|
|
46976
47096
|
return;
|
|
46977
47097
|
const current = levels.indexOf(session.thinkingLevel);
|
|
46978
47098
|
const level = levels[(current + 1) % levels.length];
|
|
46979
47099
|
session.agent.state.thinkingLevel = level;
|
|
46980
|
-
|
|
47100
|
+
const epoch = ++this.thinkingEpoch;
|
|
47101
|
+
this.dispatchBestEffort("cycle thinking level", this.client.setThinkingLevelAck(level, options).then((result) => {
|
|
47102
|
+
this.applyThinkingAck(session, epoch, result, options?.persist === true);
|
|
47103
|
+
}));
|
|
46981
47104
|
return level;
|
|
46982
47105
|
}
|
|
46983
47106
|
},
|
|
@@ -47021,6 +47144,14 @@ var init_isolated_runtime = __esm(() => {
|
|
|
47021
47144
|
this.engineCallbackActive = false;
|
|
47022
47145
|
}
|
|
47023
47146
|
}
|
|
47147
|
+
applyThinkingAck(session, epoch, result, persist) {
|
|
47148
|
+
if (persist) {
|
|
47149
|
+
applyPersistedThinkingDefault(session, result.level, thinkingPersistTarget(result));
|
|
47150
|
+
}
|
|
47151
|
+
if (epoch === this.thinkingEpoch) {
|
|
47152
|
+
session.agent.state.thinkingLevel = result.level;
|
|
47153
|
+
}
|
|
47154
|
+
}
|
|
47024
47155
|
dispatchBestEffort(label, operation) {
|
|
47025
47156
|
operation.catch((error) => {
|
|
47026
47157
|
if (this.health.isRecovering())
|
|
@@ -47061,6 +47192,12 @@ var init_isolated_runtime = __esm(() => {
|
|
|
47061
47192
|
}
|
|
47062
47193
|
});
|
|
47063
47194
|
}
|
|
47195
|
+
async syncPersistedModelCatalog(session, model) {
|
|
47196
|
+
const alreadyInScope = session.scopedModels.some((scoped) => scoped.model.provider === model.provider && scoped.model.id === model.id);
|
|
47197
|
+
const catalog = await this.client.requestInternal({ type: "get_available_models" });
|
|
47198
|
+
this.remoteModelCatalog.apply(catalog);
|
|
47199
|
+
applyPersistedModelDefault(session, model, alreadyInScope);
|
|
47200
|
+
}
|
|
47064
47201
|
refreshSessionView() {
|
|
47065
47202
|
const session = super.session;
|
|
47066
47203
|
const sessionFile = session.sessionFile;
|
|
@@ -47100,6 +47237,7 @@ var init_isolated_runtime = __esm(() => {
|
|
|
47100
47237
|
session.agent.state.model = event.model;
|
|
47101
47238
|
break;
|
|
47102
47239
|
case "thinking_level_changed":
|
|
47240
|
+
this.thinkingEpoch += 1;
|
|
47103
47241
|
session.agent.state.thinkingLevel = event.level;
|
|
47104
47242
|
break;
|
|
47105
47243
|
case "session_info_changed":
|
|
@@ -48313,7 +48451,7 @@ var init_slash_commands = __esm(() => {
|
|
|
48313
48451
|
{ name: "tree", description: "Navigate session tree (switch branches)" },
|
|
48314
48452
|
{ name: "thinking", description: "Set thinking level", argumentHint: "<level>" },
|
|
48315
48453
|
{ name: "scoped-models", description: "Enable/disable models for ctrl+p cycling" },
|
|
48316
|
-
{ name: "fast", description: "Configure
|
|
48454
|
+
{ name: "fast", description: "Configure OpenAI fast mode for chat and workflows in supported models" },
|
|
48317
48455
|
{ name: "export", description: "Export session (HTML default, or specify path: .html/.jsonl)" },
|
|
48318
48456
|
{ name: "import", description: "Import and resume a session from a JSONL file" },
|
|
48319
48457
|
{ name: "share", description: "Share session as a secret GitHub gist" },
|
|
@@ -49765,7 +49903,7 @@ var init_interactive_autocomplete = __esm(() => {
|
|
|
49765
49903
|
return [...this.session.modelRuntime.getAvailableSnapshot()];
|
|
49766
49904
|
};
|
|
49767
49905
|
InteractiveModeBase.prototype.hasCodexFastModeSupportedModels = function() {
|
|
49768
|
-
return hasSupportedCodexFastModeModel(this.getCodexFastModeCandidateModels());
|
|
49906
|
+
return hasSupportedCodexFastModeModel(this.getCodexFastModeCandidateModels(), this.session.modelRuntime.getCredentialSnapshot?.("github-copilot"));
|
|
49769
49907
|
};
|
|
49770
49908
|
InteractiveModeBase.prototype.buildRemoteSlashCommands = function(localCommands) {
|
|
49771
49909
|
const remote = getInteractiveEngineRemoteCommands(this.runtimeHost);
|
|
@@ -50453,7 +50591,7 @@ var init_interactive_startup = __esm(() => {
|
|
|
50453
50591
|
if (!model) {
|
|
50454
50592
|
return modelLabel2;
|
|
50455
50593
|
}
|
|
50456
|
-
const fastModeEnabled = shouldApplyCodexFastMode(model, this.session.settingsManager.getCodexFastModeSettings(), this.session.orchestrationContext);
|
|
50594
|
+
const fastModeEnabled = shouldApplyCodexFastMode(model, this.session.settingsManager.getCodexFastModeSettings(), this.session.orchestrationContext, this.session.modelRuntime.getCredentialSnapshot?.("github-copilot"));
|
|
50457
50595
|
return formatCodexFastModeModelLabel(modelLabel2, fastModeEnabled);
|
|
50458
50596
|
};
|
|
50459
50597
|
InteractiveModeBase.prototype.getStartupIdentityText = function(maxWidth, gap = 0, manifestoPhase = 4) {
|
|
@@ -51379,7 +51517,7 @@ var init_interactive_extension_runtime = __esm(() => {
|
|
|
51379
51517
|
if (shortcuts.size === 0)
|
|
51380
51518
|
return;
|
|
51381
51519
|
const createContext = () => ({
|
|
51382
|
-
ui:
|
|
51520
|
+
ui: extensionRunner.getUIContext(),
|
|
51383
51521
|
mode: "tui",
|
|
51384
51522
|
hasUI: true,
|
|
51385
51523
|
cwd: this.sessionManager.getCwd(),
|
|
@@ -54968,7 +55106,7 @@ var init_interactive_selectors = __esm(() => {
|
|
|
54968
55106
|
});
|
|
54969
55107
|
|
|
54970
55108
|
// src/modes/interactive/interactive-model-routing.ts
|
|
54971
|
-
import { clampThinkingLevel as
|
|
55109
|
+
import { clampThinkingLevel as clampThinkingLevel6 } from "@bastani/pi-ai/compat";
|
|
54972
55110
|
function resolveThinkingSelectorDefault(rawDefault, availableLevels, model) {
|
|
54973
55111
|
if (rawDefault === undefined)
|
|
54974
55112
|
return;
|
|
@@ -54976,7 +55114,7 @@ function resolveThinkingSelectorDefault(rawDefault, availableLevels, model) {
|
|
|
54976
55114
|
return rawDefault;
|
|
54977
55115
|
if (!model)
|
|
54978
55116
|
return availableLevels.includes("off") ? "off" : availableLevels[0];
|
|
54979
|
-
const clamped =
|
|
55117
|
+
const clamped = clampThinkingLevel6(model, rawDefault);
|
|
54980
55118
|
if (availableLevels.includes(clamped))
|
|
54981
55119
|
return clamped;
|
|
54982
55120
|
return availableLevels.includes("off") ? "off" : availableLevels[0];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/web-access",
|
|
3
|
-
"version": "0.9.16-alpha.
|
|
3
|
+
"version": "0.9.16-alpha.9",
|
|
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": [
|
|
@@ -6,6 +6,21 @@ 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.16-alpha.8] - 2026-08-27
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added a dedicated `workflow answer` action for responding to pending primitive and structured human-in-the-loop prompts without exposing stage-message delivery semantics.
|
|
14
|
+
- Added durable pending-stage message state for ordinary Intercom delivery, including FIFO delivery before the first model turn, resume/replay persistence, exactly-once stage-attempt handling, lifecycle failure notifications, and guidance for propagating material updates to known workflow stages that have not started. ([#2717](https://github.com/bastani-inc/atomic/issues/2717))
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Periodic workflow heartbeat prompts now guide supervising agents to use ordinary Intercom when steering or communication is useful, match an update's reach to the expanded workflow topology, send shared scope or acceptance changes consistently across every relevant live and known unstarted worker/reviewer stage, account for immediate and queued pre-first-turn delivery, and use workflow pause, resume, interrupt, or quit for run control.
|
|
19
|
+
|
|
20
|
+
### Removed
|
|
21
|
+
|
|
22
|
+
- Removed the public `workflow send` action and its stage-chat delivery modes. Use `workflow answer` for pending human-input prompts, `workflow resume` for paused control, and ordinary Intercom for live or deferred workflow-stage communication.
|
|
23
|
+
|
|
9
24
|
## [0.9.16-alpha.7] - 2026-08-26
|
|
10
25
|
|
|
11
26
|
### Changed
|