maka-agent 0.2.0-dev.64.20260929 → 0.2.0-dev.67.20261002
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/LICENSE +1 -1
- package/THIRD_PARTY_NOTICES.txt +3 -3
- package/dist/pi-tui-runner.js +26 -29
- package/dist/tui-copy-catalog.js +9 -9
- package/native/runtime-host-peer/prebuilds/darwin-arm64/maka_runtime_host_peer.node +0 -0
- package/native/runtime-host-peer/prebuilds/linux-arm64/maka_runtime_host_peer.node +0 -0
- package/native/runtime-host-peer/prebuilds/linux-x64/maka_runtime_host_peer.node +0 -0
- package/native/runtime-host-peer/prebuilds/win32-x64/maka_runtime_host_peer.node +0 -0
- package/native/runtime-host-windows-task-launcher/prebuilds/win32-x64/maka-runtime-host-task-launcher.exe +0 -0
- package/node_modules/@maka/core/dist/settings.js +2 -2
- package/node_modules/@maka/core/dist/tool-ledger-scanner.js +53 -150
- package/node_modules/@maka/runtime/dist/ai-sdk-compaction.js +8 -1
- package/node_modules/@maka/runtime/dist/conversation-copy.js +6 -0
- package/node_modules/@maka/runtime/dist/runtime-event-read-model.js +17 -0
- package/node_modules/@maka/runtime/dist/session-manager.js +25 -40
- package/node_modules/@maka/runtime/dist/stream-graph-coordinator.js +79 -13
- package/node_modules/@maka/runtime/dist/stream-graph-projection.js +64 -0
- package/node_modules/@maka/runtime/dist/stream-graph-read-model.js +138 -20
- package/node_modules/@maka/runtime/dist/tool-availability.js +10 -3
- package/node_modules/@maka/runtime-host/dist/candidate-entry.js +15 -0
- package/node_modules/@maka/runtime-host/dist/candidate-startup-failure.js +5 -0
- package/node_modules/@maka/runtime-host/dist/client/session-catalog-summary.js +1 -0
- package/node_modules/@maka/runtime-host/dist/client/startup-error.js +5 -0
- package/node_modules/@maka/runtime-host/dist/protocol/agent-graph.js +46 -1
- package/node_modules/@maka/runtime-host/dist/protocol/index.js +14 -1
- package/node_modules/@maka/runtime-host/dist/protocol/operations.js +5 -1
- package/node_modules/@maka/runtime-host/dist/protocol/session-catalog.js +12 -0
- package/node_modules/@maka/runtime-host/dist/protocol/session-retirement.js +46 -10
- package/node_modules/@maka/runtime-host/dist/protocol/storage-usage.js +155 -0
- package/node_modules/@maka/runtime-host/dist/server/agent-graph-coordinator.js +23 -0
- package/node_modules/@maka/runtime-host/dist/server/canonical-turn-snapshot.js +5 -0
- package/node_modules/@maka/runtime-host/dist/server/execution-composition.js +27 -6
- package/node_modules/@maka/runtime-host/dist/server/hosted-execution-tool-profile.js +2 -0
- package/node_modules/@maka/runtime-host/dist/server/session-catalog-coordinator.js +6 -0
- package/node_modules/@maka/runtime-host/dist/server/session-retirement-coordinator.js +112 -36
- package/node_modules/@maka/runtime-host/dist/server/session-revision-coordinator.js +27 -1
- package/node_modules/@maka/runtime-host/dist/server/storage-usage-coordinator.js +67 -0
- package/node_modules/@maka/runtime-host/dist/server/workhub-inspection-tool.js +208 -0
- package/node_modules/@maka/storage/dist/git-worktree-child-executor.js +3 -1
- package/node_modules/@maka/storage/dist/operational-state-store.js +0 -13
- package/node_modules/@maka/storage/dist/session-store.js +9 -6
- package/node_modules/@maka/storage/dist/sqlite-file-set.js +22 -0
- package/node_modules/@maka/storage/dist/sqlite-long-term-memory-store.js +1 -3
- package/node_modules/@maka/storage/dist/sqlite-runtime-store.js +10 -260
- package/node_modules/@maka/storage/dist/sqlite-session-catalog-query.js +1 -0
- package/node_modules/@maka/storage/dist/sqlite-session-metadata-schema.js +18 -6
- package/node_modules/@maka/storage/dist/sqlite-session-metadata-store.js +28 -6
- package/node_modules/@maka/storage/dist/storage-footprint.js +239 -0
- package/node_modules/@maka/storage/dist/storage-writer-composition.js +10 -1
- package/node_modules/axios/CHANGELOG.md +62 -0
- package/node_modules/axios/README.md +297 -5
- package/node_modules/axios/dist/axios.js +728 -170
- package/node_modules/axios/dist/axios.min.js +3 -3
- package/node_modules/axios/dist/browser/axios.cjs +871 -188
- package/node_modules/axios/dist/esm/axios.js +871 -188
- package/node_modules/axios/dist/esm/axios.min.js +2 -2
- package/node_modules/axios/dist/node/axios.cjs +1037 -225
- package/node_modules/axios/lib/adapters/fetch.js +64 -11
- package/node_modules/axios/lib/adapters/http.js +140 -67
- package/node_modules/axios/lib/adapters/xhr.js +52 -3
- package/node_modules/axios/lib/core/Axios.js +43 -20
- package/node_modules/axios/lib/core/AxiosError.js +33 -2
- package/node_modules/axios/lib/core/AxiosHeaders.js +124 -1
- package/node_modules/axios/lib/core/InterceptorManager.js +107 -8
- package/node_modules/axios/lib/core/buildFullPath.js +41 -15
- package/node_modules/axios/lib/core/dispatchRequest.js +8 -2
- package/node_modules/axios/lib/core/mergeConfig.js +19 -4
- package/node_modules/axios/lib/core/methodList.js +17 -0
- package/node_modules/axios/lib/core/setFormDataHeaders.js +27 -0
- package/node_modules/axios/lib/defaults/index.js +2 -1
- package/node_modules/axios/lib/env/data.js +1 -1
- package/node_modules/axios/lib/helpers/Http2Sessions.js +2 -0
- package/node_modules/axios/lib/helpers/HttpStatusCode.js +12 -1
- package/node_modules/axios/lib/helpers/combineURLs.js +11 -3
- package/node_modules/axios/lib/helpers/composeSignals.js +12 -1
- package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +115 -54
- package/node_modules/axios/lib/helpers/formDataToJSON.js +11 -5
- package/node_modules/axios/lib/helpers/fromDataURI.js +5 -4
- package/node_modules/axios/lib/helpers/normalizeURLForProtocolCheck.js +24 -0
- package/node_modules/axios/lib/helpers/parseHeaders.js +5 -3
- package/node_modules/axios/lib/helpers/progressEventReducer.js +4 -4
- package/node_modules/axios/lib/helpers/resolveConfig.js +5 -17
- package/node_modules/axios/lib/helpers/shouldBypassProxy.js +300 -5
- package/node_modules/axios/lib/helpers/throttle.js +3 -2
- package/node_modules/axios/lib/helpers/toFormData.js +17 -23
- package/node_modules/axios/lib/platform/node/classes/Buffer.js +11 -0
- package/node_modules/axios/lib/utils.js +151 -18
- package/node_modules/axios/package.json +21 -19
- package/node_modules/brace-expansion/dist/commonjs/index.js +69 -25
- package/node_modules/brace-expansion/dist/esm/index.js +68 -24
- package/node_modules/brace-expansion/package.json +2 -1
- package/node_modules/fast-uri/index.js +10 -6
- package/node_modules/fast-uri/package.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed to the Apache Software Foundation (ASF) under one
|
|
3
|
+
* or more contributor license agreements. See the NOTICE file
|
|
4
|
+
* distributed with this work for additional information
|
|
5
|
+
* regarding copyright ownership. The ASF licenses this file
|
|
6
|
+
* to you under the Apache License, Version 2.0 (the
|
|
7
|
+
* "License"); you may not use this file except in compliance
|
|
8
|
+
* with the License. You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing,
|
|
13
|
+
* software distributed under the License is distributed on an
|
|
14
|
+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
15
|
+
* KIND, either express or implied. See the License for the
|
|
16
|
+
* specific language governing permissions and limitations
|
|
17
|
+
* under the License.
|
|
18
|
+
*/
|
|
19
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { SUBAGENT_WORKTREE_DIRECTORY } from './git-worktree-child-executor.js';
|
|
22
|
+
import { LONG_TERM_MEMORY_DATABASE_NAME } from './long-term-memory-store.js';
|
|
23
|
+
import { acquireOperationalStateDatabase, OPERATIONAL_STATE_DATABASE_NAME, } from './operational-state-store.js';
|
|
24
|
+
import { CONTEXT_OFFLOAD_DATABASE_NAME, CONTEXT_OFFLOAD_VALUES_DIRECTORY_NAME, } from './sqlite-context-offload-store.js';
|
|
25
|
+
import { sqliteDatabaseSidecars } from './sqlite-file-set.js';
|
|
26
|
+
/**
|
|
27
|
+
* Per-Session payload sums. Each statement covers one Session through an index
|
|
28
|
+
* that leads with `session_id`, so its cost grows with that Session's rows
|
|
29
|
+
* rather than with the table. `octet_length` on TEXT and `length` on BLOB skip
|
|
30
|
+
* the overflow pages of large values, but every matching row is still read.
|
|
31
|
+
*/
|
|
32
|
+
const TRANSCRIPT_SOURCES = [
|
|
33
|
+
{ table: 'session_messages', bytes: 'octet_length(record_json)' },
|
|
34
|
+
{ table: 'session_message_chunks', bytes: 'length(data)' },
|
|
35
|
+
];
|
|
36
|
+
const RUNTIME_SOURCES = [
|
|
37
|
+
{ table: 'runtime_events', bytes: 'octet_length(payload_json)' },
|
|
38
|
+
{
|
|
39
|
+
table: 'runtime_partial_snapshots',
|
|
40
|
+
bytes: 'octet_length(payload_json) + octet_length(text_content)',
|
|
41
|
+
},
|
|
42
|
+
{ table: 'core_agent_run_events', bytes: 'octet_length(record_json)' },
|
|
43
|
+
];
|
|
44
|
+
const ARTIFACT_SOURCE = {
|
|
45
|
+
table: 'artifact_records',
|
|
46
|
+
bytes: "COALESCE(json_extract(record_json, '$.sizeBytes'), 0)",
|
|
47
|
+
};
|
|
48
|
+
const HAS_WORKTREE = "json_extract(payload_json, '$.subagentWorkspace') IS NOT NULL";
|
|
49
|
+
/**
|
|
50
|
+
* Opens a read-only footprint reader over one State Root. It shares the
|
|
51
|
+
* process-local runtime.sqlite connection and adds no triggers or counters, so
|
|
52
|
+
* the write path pays nothing for it (#5038). Every statement runs on its own
|
|
53
|
+
* and the reader yields to the event loop after it, so no read transaction is
|
|
54
|
+
* held and the Host keeps serving between statements.
|
|
55
|
+
*/
|
|
56
|
+
export function openStorageFootprintReader(root, options = {}) {
|
|
57
|
+
const lease = acquireOperationalStateDatabase(root, { schemaMigration: 'require_current' });
|
|
58
|
+
return new SqliteStorageFootprintReader(root, lease, options.contextOffload);
|
|
59
|
+
}
|
|
60
|
+
class SqliteStorageFootprintReader {
|
|
61
|
+
root;
|
|
62
|
+
lease;
|
|
63
|
+
contextOffload;
|
|
64
|
+
#closed = false;
|
|
65
|
+
constructor(root, lease, contextOffload) {
|
|
66
|
+
this.root = root;
|
|
67
|
+
this.lease = lease;
|
|
68
|
+
this.contextOffload = contextOffload;
|
|
69
|
+
}
|
|
70
|
+
async measure() {
|
|
71
|
+
this.#assertOpen();
|
|
72
|
+
const databaseBytes = await fileSetBytes(join(this.root, OPERATIONAL_STATE_DATABASE_NAME));
|
|
73
|
+
const reclaimableBytes = this.#readReclaimableBytes();
|
|
74
|
+
await yieldToEventLoop();
|
|
75
|
+
// One small metadata row per artifact file, so the whole table stays cheap.
|
|
76
|
+
const artifacts = this.#readAllArtifactBytes();
|
|
77
|
+
await yieldToEventLoop();
|
|
78
|
+
// Inline blobs live inside the SQLite file set, so only the managed value
|
|
79
|
+
// files outside it are added; the Store's physical-byte counter covers both.
|
|
80
|
+
const contextBytes = (await fileSetBytes(join(this.root, CONTEXT_OFFLOAD_DATABASE_NAME))) +
|
|
81
|
+
(await directoryBytes(join(this.root, CONTEXT_OFFLOAD_VALUES_DIRECTORY_NAME)));
|
|
82
|
+
const memoryBytes = await fileSetBytes(join(this.root, LONG_TERM_MEMORY_DATABASE_NAME));
|
|
83
|
+
const worktreeCount = await countDirectories(join(this.root, SUBAGENT_WORKTREE_DIRECTORY));
|
|
84
|
+
const totals = [
|
|
85
|
+
{ kind: 'database', bytes: databaseBytes, exact: true },
|
|
86
|
+
{ kind: 'artifacts', bytes: artifacts, exact: false },
|
|
87
|
+
{ kind: 'context_offload', bytes: contextBytes, exact: true },
|
|
88
|
+
{ kind: 'memory', bytes: memoryBytes, exact: true },
|
|
89
|
+
];
|
|
90
|
+
return { totals, reclaimableBytes, worktreeCount };
|
|
91
|
+
}
|
|
92
|
+
async measureSessions(sessionIds) {
|
|
93
|
+
this.#assertOpen();
|
|
94
|
+
const results = [];
|
|
95
|
+
// One Session per statement, with a yield after each: a large task's sum
|
|
96
|
+
// is still a long range scan, and the Host serves other work between them.
|
|
97
|
+
for (const sessionId of new Set(sessionIds)) {
|
|
98
|
+
if (!(await this.#sessionExists(sessionId)))
|
|
99
|
+
continue;
|
|
100
|
+
const transcript = await this.#sumForSession(TRANSCRIPT_SOURCES, sessionId);
|
|
101
|
+
const runtime = await this.#sumForSession(RUNTIME_SOURCES, sessionId);
|
|
102
|
+
const artifacts = await this.#sumForSession([ARTIFACT_SOURCE], sessionId);
|
|
103
|
+
const worktreeCount = await this.#countWorktrees(sessionId);
|
|
104
|
+
const context = this.contextOffload
|
|
105
|
+
? (await this.contextOffload.usage(sessionId)).logicalBytes
|
|
106
|
+
: undefined;
|
|
107
|
+
results.push({
|
|
108
|
+
sessionId,
|
|
109
|
+
bytes: {
|
|
110
|
+
transcript,
|
|
111
|
+
runtime,
|
|
112
|
+
artifacts,
|
|
113
|
+
...(context === undefined ? {} : { context }),
|
|
114
|
+
},
|
|
115
|
+
worktreeCount,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return results;
|
|
119
|
+
}
|
|
120
|
+
close() {
|
|
121
|
+
if (this.#closed)
|
|
122
|
+
return;
|
|
123
|
+
this.#closed = true;
|
|
124
|
+
this.lease.close();
|
|
125
|
+
}
|
|
126
|
+
async #sessionExists(sessionId) {
|
|
127
|
+
const row = this.lease.database
|
|
128
|
+
.prepare('SELECT 1 AS present FROM session_metadata WHERE session_id = ?')
|
|
129
|
+
.get(sessionId);
|
|
130
|
+
await yieldToEventLoop();
|
|
131
|
+
return row !== undefined;
|
|
132
|
+
}
|
|
133
|
+
async #sumForSession(sources, sessionId) {
|
|
134
|
+
let total = 0;
|
|
135
|
+
for (const source of sources) {
|
|
136
|
+
const row = this.lease.database
|
|
137
|
+
.prepare(`SELECT COALESCE(SUM(${source.bytes}), 0) AS bytes
|
|
138
|
+
FROM ${source.table}
|
|
139
|
+
WHERE session_id = ?`)
|
|
140
|
+
.get(sessionId);
|
|
141
|
+
total += toSafeCount(row.bytes);
|
|
142
|
+
await yieldToEventLoop();
|
|
143
|
+
}
|
|
144
|
+
return total;
|
|
145
|
+
}
|
|
146
|
+
async #countWorktrees(sessionId) {
|
|
147
|
+
const row = this.lease.database
|
|
148
|
+
.prepare(`SELECT
|
|
149
|
+
(SELECT COUNT(*) FROM session_metadata
|
|
150
|
+
WHERE session_id = ? AND ${HAS_WORKTREE})
|
|
151
|
+
+ (SELECT COUNT(*) FROM session_metadata
|
|
152
|
+
WHERE subagent_parent_session_id = ? AND ${HAS_WORKTREE}) AS count`)
|
|
153
|
+
.get(sessionId, sessionId);
|
|
154
|
+
await yieldToEventLoop();
|
|
155
|
+
return toSafeCount(row.count);
|
|
156
|
+
}
|
|
157
|
+
#readAllArtifactBytes() {
|
|
158
|
+
const row = this.lease.database
|
|
159
|
+
.prepare(`SELECT COALESCE(SUM(${ARTIFACT_SOURCE.bytes}), 0) AS bytes FROM ${ARTIFACT_SOURCE.table}`)
|
|
160
|
+
.get();
|
|
161
|
+
return toSafeCount(row.bytes);
|
|
162
|
+
}
|
|
163
|
+
#readReclaimableBytes() {
|
|
164
|
+
const pageSize = this.lease.database.prepare('PRAGMA page_size').get();
|
|
165
|
+
const freelist = this.lease.database.prepare('PRAGMA freelist_count').get();
|
|
166
|
+
return toSafeCount(freelist.freelist_count) * toSafeCount(pageSize.page_size);
|
|
167
|
+
}
|
|
168
|
+
#assertOpen() {
|
|
169
|
+
if (this.#closed)
|
|
170
|
+
throw new Error('Storage footprint reader is closed');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function fileSetBytes(databasePath) {
|
|
174
|
+
let total = 0;
|
|
175
|
+
for (const path of [databasePath, ...sqliteDatabaseSidecars(databasePath)]) {
|
|
176
|
+
try {
|
|
177
|
+
total += (await stat(path)).size;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (!isMissingFile(error))
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return total;
|
|
185
|
+
}
|
|
186
|
+
/** Files under the managed context value tree (`sha256/<xx>/<blob>`), stat'ed asynchronously. */
|
|
187
|
+
async function directoryBytes(path, depth = 0) {
|
|
188
|
+
let entries;
|
|
189
|
+
try {
|
|
190
|
+
entries = await readdir(path, { withFileTypes: true });
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (isMissingFile(error))
|
|
194
|
+
return 0;
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
let total = 0;
|
|
198
|
+
for (const entry of entries) {
|
|
199
|
+
const child = join(path, entry.name);
|
|
200
|
+
if (entry.isDirectory() && depth < 3) {
|
|
201
|
+
total += await directoryBytes(child, depth + 1);
|
|
202
|
+
}
|
|
203
|
+
else if (entry.isFile()) {
|
|
204
|
+
try {
|
|
205
|
+
total += (await stat(child)).size;
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
// A value file deleted mid-walk simply no longer counts.
|
|
209
|
+
if (!isMissingFile(error))
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return total;
|
|
215
|
+
}
|
|
216
|
+
async function countDirectories(path) {
|
|
217
|
+
try {
|
|
218
|
+
const entries = await readdir(path, { withFileTypes: true });
|
|
219
|
+
return entries.filter((entry) => entry.isDirectory()).length;
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
if (isMissingFile(error))
|
|
223
|
+
return 0;
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function toSafeCount(value) {
|
|
228
|
+
const count = Number(value);
|
|
229
|
+
if (!Number.isSafeInteger(count) || count < 0) {
|
|
230
|
+
throw new Error('Storage footprint measurement is out of range');
|
|
231
|
+
}
|
|
232
|
+
return count;
|
|
233
|
+
}
|
|
234
|
+
function isMissingFile(error) {
|
|
235
|
+
return (error instanceof Error && 'code' in error && error.code === 'ENOENT');
|
|
236
|
+
}
|
|
237
|
+
function yieldToEventLoop() {
|
|
238
|
+
return new Promise((resolve) => setImmediate(resolve));
|
|
239
|
+
}
|
|
@@ -24,11 +24,12 @@ import { openInteractiveLongTermMemoryStoreForWrite } from './long-term-memory-s
|
|
|
24
24
|
import { openInteractiveMemoryBundleStoreForWrite } from './memory-bundle-store.js';
|
|
25
25
|
import { openInteractivePlanStoreForWrite } from './plan-authority.js';
|
|
26
26
|
import { openInteractiveProjectCatalogForWrite } from './project-catalog-authority.js';
|
|
27
|
-
import { assertStorageRootLease } from './root-authority.js';
|
|
27
|
+
import { assertStorageRootLease, runWithStorageRootLease, } from './root-authority.js';
|
|
28
28
|
import { openInteractiveRuntimePolicyStoresForWrite } from './runtime-policy-stores.js';
|
|
29
29
|
import { openInteractiveScheduledTaskStoreForWrite } from './scheduled-task-store.js';
|
|
30
30
|
import { openInteractiveSessionTodoStoreForWrite } from './session-todo-authority.js';
|
|
31
31
|
import { openInteractiveShellRunStoreForWrite } from './shell-run-authority.js';
|
|
32
|
+
import { openStorageFootprintReader, } from './storage-footprint.js';
|
|
32
33
|
import { openInteractiveUsageStoresForWrite } from './usage-stores.js';
|
|
33
34
|
const activeCompositions = new WeakSet();
|
|
34
35
|
export async function openStorageWriterComposition(lease, options = {}) {
|
|
@@ -109,6 +110,13 @@ async function createComposition(lease, options) {
|
|
|
109
110
|
}
|
|
110
111
|
const usage = await openWriter(() => openInteractiveUsageStoresForWrite(lease), closeWriter);
|
|
111
112
|
const shellRuns = await openWriter(() => openInteractiveShellRunStoreForWrite(lease), closeWriter);
|
|
113
|
+
const footprintReader = await openWriter(async () => openStorageFootprintReader(lease.canonicalPath, {
|
|
114
|
+
...(contextOffload ? { contextOffload } : {}),
|
|
115
|
+
}), (reader) => reader.close());
|
|
116
|
+
const footprint = Object.freeze({
|
|
117
|
+
measure: () => runWithStorageRootLease(lease, 'interactive', 'write', () => footprintReader.measure()),
|
|
118
|
+
measureSessions: (sessionIds) => runWithStorageRootLease(lease, 'interactive', 'write', () => footprintReader.measureSessions(sessionIds)),
|
|
119
|
+
});
|
|
112
120
|
return Object.freeze({
|
|
113
121
|
execution,
|
|
114
122
|
projectCatalog,
|
|
@@ -125,6 +133,7 @@ async function createComposition(lease, options) {
|
|
|
125
133
|
...(contextOffloadUnavailable ? { contextOffloadUnavailable } : {}),
|
|
126
134
|
usage,
|
|
127
135
|
shellRuns,
|
|
136
|
+
footprint,
|
|
128
137
|
close,
|
|
129
138
|
});
|
|
130
139
|
}
|
|
@@ -1,5 +1,67 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.19.0 — July 22, 2026
|
|
4
|
+
|
|
5
|
+
This release raises the form-data security floor, adds configuration and type-system capabilities, and fixes NO_PROXY matching, interceptor errors, progress reporting, and serialization edge cases.
|
|
6
|
+
|
|
7
|
+
## 🔒 Security Fixes
|
|
8
|
+
|
|
9
|
+
- Multipart Form Data: Raised the form-data dependency floor to ^4.0.6, preventing fresh installations from resolving versions affected by the CRLF injection vulnerability GHSA-hmw2-7cc7-3qxx (https://github.com/advisories/GHSA-hmw2-7cc7-3qxx). (#11028)
|
|
10
|
+
|
|
11
|
+
## 🚀 New Features
|
|
12
|
+
|
|
13
|
+
- Configuration Extensibility: Preserved own-enumerable symbol-keyed fields through mergeConfig and added a generic params type across public TypeScript declarations, responses, errors,
|
|
14
|
+
adapters, and serializers. (#11043, #11081)
|
|
15
|
+
- Header Parameter Parsing: Added the opt-in AxiosHeaders.parseParameters() parser for quote-aware, RFC-style HTTP parameter parsing while preserving legacy parsing behavior. (#11051)
|
|
16
|
+
- HTTP Status Codes: Added the missing Cloudflare 520 WebServerReturnsAnUnknownError status and matching ESM/CJS declarations. (#11067)
|
|
17
|
+
|
|
18
|
+
## 🐛 Bug Fixes
|
|
19
|
+
|
|
20
|
+
- Form Data Conversion: Limited formDataToJSON path splitting to dot and bracket notation, preserving literal punctuation in keys, and removed browser-facing Buffer.from usage from toFormData to avoid unnecessary polyfills. (#11006, #11018)
|
|
21
|
+
- Proxy Bypass: Canonicalized IPv4 shorthand, octal, and hexadecimal forms during NO_PROXY matching and honored * entries within comma- or space-separated bypass lists. (#11029, #11053)
|
|
22
|
+
- Cancellation: Propagated already-aborted input signals immediately when composing abort signals. (#11035)
|
|
23
|
+
- Header Handling: Preserved empty first values for duplicate singleton headers and made AxiosHeaders#getSetCookie() consistently return arrays for present values. (#11036, #11037)
|
|
24
|
+
- URL Handling: Included normalized, safely redacted offending URLs in malformed-protocol errors and removed repeated trailing slashes when combining base URLs. (#11008, #11038)
|
|
25
|
+
|
|
26
|
+
- Progress Events: Clamped malformed negative progress values to zero and ensured final Node.js download progress events are delivered before streamed responses close. (#11039, #11040)
|
|
27
|
+
- Error and JSON Serialization: Serialized Set values as arrays in JSON-compatible snapshots and synthesized useful AxiosError messages from otherwise-empty AggregateError instances. (#11044, #11059)
|
|
28
|
+
- Content-Length Enforcement: Corrected base64 data: URL size estimation so maxContentLength is enforced consistently by the HTTP and Fetch adapters. (#11061)
|
|
29
|
+
- Synchronous Interceptors: Prevented requests from being dispatched after synchronous request interceptors fail unless their paired rejection handler resolves successfully. (#11071)
|
|
30
|
+
|
|
31
|
+
## 🔧 Maintenance & Chores
|
|
32
|
+
|
|
33
|
+
- Dependencies: Updated development and test tooling, the docs fixture's Axios version, and GitHub Actions integrations including Checkout, Setup Node, Setup Deno, and Zizmor. (#11031, #11055, #11056, #11058, #11079, #11080, #11088, #11089, #11090)
|
|
34
|
+
- Build Outputs: Limited sourcemap generation to published minified bundles, removing broken map references from non-minified builds. (#11054)
|
|
35
|
+
- Form Data Internals: Centralized FormData header handling and made the Node.js adapter tolerate getHeaders() returning undefined under the content-only policy. (#11062)
|
|
36
|
+
- Developer Experience: Ignored common local AI-tooling directories and fixed a constant-reassignment crash when the development sandbox serves its root path. (#11032, #11073)
|
|
37
|
+
- Documentation: Updated sponsor information, clarified that baseURL is not a path-security boundary, scoped provenance claims to attested releases, and corrected the configuration-defaults documentation. (#11041, #11068, #11076, #11078)
|
|
38
|
+
- Publishing: Simplified v1 publishing to use the npm version bundled with Node.js 26 and updated package metadata for the 1.19.0 release. (#11083, #11095)
|
|
39
|
+
|
|
40
|
+
## 🌟 New Contributors
|
|
41
|
+
|
|
42
|
+
We are thrilled to welcome our new contributors. Thank you for helping improve Axios:
|
|
43
|
+
|
|
44
|
+
- @afonsojramos (#11028)
|
|
45
|
+
- @MahinAnowar (#11006)
|
|
46
|
+
- @yassertawfik4 (#11024)
|
|
47
|
+
- @AnandSundar (#11029)
|
|
48
|
+
- @lin-hongkuan (#11035)
|
|
49
|
+
- @Wali007-lab (#11054)
|
|
50
|
+
- @magicdawn (#11043)
|
|
51
|
+
- @andrewkernel (#11053)
|
|
52
|
+
- @Sagargupta16 (#11059)
|
|
53
|
+
- @Rpaudel379 (#11078)
|
|
54
|
+
- @kobihikri (#11076)
|
|
55
|
+
- @spokodev (#11061)
|
|
56
|
+
- @shaedrich (#11081)
|
|
57
|
+
- @QodeXcli (#11062)
|
|
58
|
+
- @akahoshi1421 (#11067)
|
|
59
|
+
- @TheHonoredOne914 (#11071)
|
|
60
|
+
- @Ahsan1Murtaza (#11073)
|
|
61
|
+
|
|
62
|
+
[Full Changelog](https://github.com/axios/axios/compare/v1.18.1...v1.19.0)
|
|
63
|
+
|
|
64
|
+
|
|
3
65
|
## v1.18.0 — June 13, 2026
|
|
4
66
|
|
|
5
67
|
This release hardens redirect and URL handling, improves the validateStatus configuration semantics, and includes updates to documentation, dependencies, and release metadata.
|