@alisio/core 0.1.0-alpha.9 → 0.1.1
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/README.md +52 -7
- package/dist/agents/active.d.ts +99 -0
- package/dist/agents/active.js +218 -0
- package/dist/agents/capabilities.d.ts +26 -0
- package/dist/agents/capabilities.js +120 -0
- package/dist/agents/create-agent-skill.d.ts +11 -0
- package/dist/agents/create-agent-skill.js +60 -0
- package/dist/agents/definitions.d.ts +88 -0
- package/dist/agents/definitions.js +404 -0
- package/dist/agents/draft.d.ts +41 -0
- package/dist/agents/draft.js +133 -0
- package/dist/agents/service.d.ts +57 -0
- package/dist/agents/service.js +86 -0
- package/dist/agents/templates.d.ts +8 -0
- package/dist/agents/templates.js +102 -0
- package/dist/analysis/capabilities.d.ts +48 -0
- package/dist/analysis/capabilities.js +90 -0
- package/dist/analysis/data/csv.d.ts +46 -0
- package/dist/analysis/data/csv.js +240 -0
- package/dist/analysis/data/datasets.d.ts +132 -0
- package/dist/analysis/data/datasets.js +441 -0
- package/dist/analysis/data/describe.d.ts +27 -0
- package/dist/analysis/data/describe.js +103 -0
- package/dist/analysis/data/engine-client.d.ts +58 -0
- package/dist/analysis/data/engine-client.js +304 -0
- package/dist/analysis/data/engine-entry.d.ts +1 -0
- package/dist/analysis/data/engine-entry.js +59 -0
- package/dist/analysis/data/engine-source.d.ts +4 -0
- package/dist/analysis/data/engine-source.js +6 -0
- package/dist/analysis/data/engine-types.d.ts +86 -0
- package/dist/analysis/data/engine-types.js +7 -0
- package/dist/analysis/data/infer.d.ts +42 -0
- package/dist/analysis/data/infer.js +118 -0
- package/dist/analysis/data/ingest-worker.d.ts +17 -0
- package/dist/analysis/data/ingest-worker.js +365 -0
- package/dist/analysis/data/json.d.ts +19 -0
- package/dist/analysis/data/json.js +44 -0
- package/dist/analysis/data/query-worker.d.ts +12 -0
- package/dist/analysis/data/query-worker.js +75 -0
- package/dist/analysis/data/rows.d.ts +39 -0
- package/dist/analysis/data/rows.js +120 -0
- package/dist/analysis/data/sql-guard.d.ts +20 -0
- package/dist/analysis/data/sql-guard.js +129 -0
- package/dist/analysis/data/stats.d.ts +18 -0
- package/dist/analysis/data/stats.js +77 -0
- package/dist/analysis/install-hints.d.ts +33 -0
- package/dist/analysis/install-hints.js +144 -0
- package/dist/analysis/janitor.d.ts +60 -0
- package/dist/analysis/janitor.js +264 -0
- package/dist/analysis/jobs.d.ts +94 -0
- package/dist/analysis/jobs.js +165 -0
- package/dist/analysis/oci.d.ts +129 -0
- package/dist/analysis/oci.js +330 -0
- package/dist/analysis/python/sources.d.ts +2 -0
- package/dist/analysis/python/sources.js +10 -0
- package/dist/analysis/requirements.d.ts +32 -0
- package/dist/analysis/requirements.js +73 -0
- package/dist/analysis/rerun.d.ts +40 -0
- package/dist/analysis/rerun.js +136 -0
- package/dist/analysis/runtime-manager.d.ts +146 -0
- package/dist/analysis/runtime-manager.js +472 -0
- package/dist/analysis/status.d.ts +21 -0
- package/dist/analysis/status.js +52 -0
- package/dist/application.d.ts +105 -3
- package/dist/application.js +446 -18
- package/dist/artifacts/kinds.d.ts +35 -0
- package/dist/artifacts/kinds.js +177 -0
- package/dist/artifacts/publisher.d.ts +7 -0
- package/dist/artifacts/publisher.js +29 -0
- package/dist/artifacts/store.d.ts +119 -0
- package/dist/artifacts/store.js +581 -0
- package/dist/background/janitor.d.ts +22 -0
- package/dist/background/janitor.js +62 -0
- package/dist/background/mirror.d.ts +14 -0
- package/dist/background/mirror.js +41 -0
- package/dist/background/notify.d.ts +58 -0
- package/dist/background/notify.js +172 -0
- package/dist/background/output.d.ts +46 -0
- package/dist/background/output.js +179 -0
- package/dist/background/service.d.ts +137 -0
- package/dist/background/service.js +410 -0
- package/dist/background/store.d.ts +103 -0
- package/dist/background/store.js +195 -0
- package/dist/changelog/data.d.ts +6 -0
- package/dist/changelog/data.js +306 -0
- package/dist/changelog/index.d.ts +5 -0
- package/dist/changelog/index.js +7 -0
- package/dist/changelog/parse.d.ts +53 -0
- package/dist/changelog/parse.js +160 -0
- package/dist/commands/builtins.d.ts +10 -0
- package/dist/commands/builtins.js +161 -0
- package/dist/commands/catalog.d.ts +86 -0
- package/dist/commands/catalog.js +304 -0
- package/dist/config.d.ts +206 -6
- package/dist/config.js +426 -20
- package/dist/core/compaction.js +13 -2
- package/dist/core/contracts.d.ts +180 -3
- package/dist/core/opt-in.d.ts +12 -0
- package/dist/core/opt-in.js +12 -0
- package/dist/core/output-limit.d.ts +34 -0
- package/dist/core/output-limit.js +39 -0
- package/dist/core/run-stats.d.ts +16 -0
- package/dist/core/run-stats.js +8 -0
- package/dist/core/runner.d.ts +134 -4
- package/dist/core/runner.js +780 -138
- package/dist/core/timeout.d.ts +15 -0
- package/dist/core/timeout.js +61 -0
- package/dist/core/truncation.d.ts +30 -0
- package/dist/core/truncation.js +83 -0
- package/dist/goal/blockers.d.ts +45 -0
- package/dist/goal/blockers.js +51 -0
- package/dist/goal/budget.d.ts +24 -0
- package/dist/goal/budget.js +53 -0
- package/dist/goal/command.d.ts +36 -0
- package/dist/goal/command.js +98 -0
- package/dist/goal/format.d.ts +19 -0
- package/dist/goal/format.js +102 -0
- package/dist/goal/host.d.ts +29 -0
- package/dist/goal/host.js +42 -0
- package/dist/goal/index.d.ts +9 -0
- package/dist/goal/index.js +9 -0
- package/dist/goal/machine.d.ts +186 -0
- package/dist/goal/machine.js +344 -0
- package/dist/goal/prompts.d.ts +10 -0
- package/dist/goal/prompts.js +75 -0
- package/dist/goal/service.d.ts +113 -0
- package/dist/goal/service.js +273 -0
- package/dist/goal/store.d.ts +59 -0
- package/dist/goal/store.js +184 -0
- package/dist/index.d.ts +50 -5
- package/dist/index.js +49 -4
- package/dist/mcp/connector.js +38 -6
- package/dist/mcp/rich.d.ts +41 -0
- package/dist/mcp/rich.js +362 -0
- package/dist/permissions/modes.d.ts +72 -0
- package/dist/permissions/modes.js +98 -0
- package/dist/plan/exit-plan.d.ts +25 -0
- package/dist/plan/exit-plan.js +130 -0
- package/dist/plan/state.d.ts +102 -0
- package/dist/plan/state.js +165 -0
- package/dist/plugins/host.d.ts +34 -1
- package/dist/plugins/host.js +143 -9
- package/dist/providers/settings.d.ts +15 -0
- package/dist/providers/settings.js +38 -0
- package/dist/reload.d.ts +75 -0
- package/dist/reload.js +204 -0
- package/dist/resources/context.js +6 -1
- package/dist/runtime/access.d.ts +62 -0
- package/dist/runtime/access.js +115 -0
- package/dist/runtime/blobs.d.ts +51 -0
- package/dist/runtime/blobs.js +177 -0
- package/dist/runtime/diff.d.ts +23 -0
- package/dist/runtime/diff.js +154 -0
- package/dist/runtime/ids.d.ts +8 -0
- package/dist/runtime/ids.js +32 -0
- package/dist/runtime/paths.d.ts +11 -0
- package/dist/runtime/paths.js +17 -1
- package/dist/runtime/process.d.ts +22 -0
- package/dist/runtime/process.js +100 -15
- package/dist/runtime/sqlite.d.ts +2 -0
- package/dist/runtime/sqlite.js +18 -0
- package/dist/runtime/store.d.ts +91 -3
- package/dist/runtime/store.js +465 -11
- package/dist/runtime/zip.d.ts +24 -0
- package/dist/runtime/zip.js +126 -0
- package/dist/sessions/children.js +17 -1
- package/dist/sessions/side-questions.d.ts +57 -0
- package/dist/sessions/side-questions.js +161 -0
- package/dist/tools/analysis.d.ts +37 -0
- package/dist/tools/analysis.js +573 -0
- package/dist/tools/artifacts.d.ts +14 -0
- package/dist/tools/artifacts.js +143 -0
- package/dist/tools/background.d.ts +7 -0
- package/dist/tools/background.js +165 -0
- package/dist/tools/data.d.ts +7 -0
- package/dist/tools/data.js +160 -0
- package/dist/tools/execute.d.ts +5 -0
- package/dist/tools/execute.js +15 -3
- package/dist/tools/goal.d.ts +19 -0
- package/dist/tools/goal.js +126 -0
- package/dist/tools/search.d.ts +17 -3
- package/dist/tools/search.js +153 -0
- package/dist/tools/standard.d.ts +4 -1
- package/dist/tools/standard.js +99 -18
- package/dist/version.d.ts +5 -3
- package/dist/version.js +35 -6
- package/package.json +2 -2
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence of background tasks (table `background_tasks`, schema v7). Every state change is a
|
|
3
|
+
* compare-and-set in SQL (`UPDATE … WHERE status IN (…)`), so two actors racing for the same task
|
|
4
|
+
* (the exit of the process, a stop from the user, the watchdog, another Alisio process on the same
|
|
5
|
+
* database) can never move it out of a terminal state or back.
|
|
6
|
+
*
|
|
7
|
+
* queued ──▶ running ──▶ stopping ──▶ cancelled | failed(timeout)
|
|
8
|
+
* └────────▶ succeeded | failed (the process ended by itself)
|
|
9
|
+
* queued | running | stopping ──▶ lost (the owner process is gone: startup only)
|
|
10
|
+
*/
|
|
11
|
+
import { relative } from "node:path";
|
|
12
|
+
import { inside } from "../runtime/paths.js";
|
|
13
|
+
import { isProcessAlive } from "../runtime/process.js";
|
|
14
|
+
export const LIVE_STATES = [
|
|
15
|
+
"queued",
|
|
16
|
+
"running",
|
|
17
|
+
"stopping",
|
|
18
|
+
];
|
|
19
|
+
export const TERMINAL_STATES = [
|
|
20
|
+
"succeeded",
|
|
21
|
+
"failed",
|
|
22
|
+
"cancelled",
|
|
23
|
+
"lost",
|
|
24
|
+
];
|
|
25
|
+
export const isLive = (status) => LIVE_STATES.includes(status);
|
|
26
|
+
export const isTerminal = (status) => !isLive(status);
|
|
27
|
+
const sqlList = (values) => values.map((v) => `'${v}'`).join(",");
|
|
28
|
+
const num = (value) => value === null || value === undefined ? undefined : Number(value);
|
|
29
|
+
const text = (value) => value === null || value === undefined ? undefined : String(value);
|
|
30
|
+
export function toRow(r) {
|
|
31
|
+
return {
|
|
32
|
+
id: String(r.id),
|
|
33
|
+
session: String(r.session),
|
|
34
|
+
rootSession: String(r.root_session),
|
|
35
|
+
workspace: String(r.workspace),
|
|
36
|
+
kind: r.kind,
|
|
37
|
+
label: String(r.label),
|
|
38
|
+
...(text(r.command) !== undefined ? { command: text(r.command) } : {}),
|
|
39
|
+
...(text(r.cwd) !== undefined ? { cwd: text(r.cwd) } : {}),
|
|
40
|
+
status: r.status,
|
|
41
|
+
...(num(r.exit_code) !== undefined ? { exitCode: num(r.exit_code) } : {}),
|
|
42
|
+
...(text(r.signal) !== undefined ? { signal: text(r.signal) } : {}),
|
|
43
|
+
...(text(r.error_code) !== undefined ? { errorCode: text(r.error_code) } : {}),
|
|
44
|
+
...(text(r.abort_origin) !== undefined
|
|
45
|
+
? { abortOrigin: r.abort_origin }
|
|
46
|
+
: {}),
|
|
47
|
+
...(num(r.pid) !== undefined ? { pid: num(r.pid) } : {}),
|
|
48
|
+
ownerPid: Number(r.owner_pid),
|
|
49
|
+
...(num(r.timeout_ms) !== undefined ? { timeoutMs: num(r.timeout_ms) } : {}),
|
|
50
|
+
logPath: String(r.log_path),
|
|
51
|
+
bytes: Number(r.bytes ?? 0),
|
|
52
|
+
truncated: Number(r.truncated ?? 0) === 1,
|
|
53
|
+
createdAt: Number(r.created_at),
|
|
54
|
+
...(num(r.started_at) !== undefined ? { startedAt: num(r.started_at) } : {}),
|
|
55
|
+
...(num(r.ended_at) !== undefined ? { endedAt: num(r.ended_at) } : {}),
|
|
56
|
+
...(num(r.delivered_at) !== undefined ? { deliveredAt: num(r.delivered_at) } : {}),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** The wire view of a row: no log path, the working directory relative to the workspace. */
|
|
60
|
+
export function toInfo(row, live) {
|
|
61
|
+
const cwd = row.cwd
|
|
62
|
+
? inside(row.workspace, row.cwd)
|
|
63
|
+
? relative(row.workspace, row.cwd) || "."
|
|
64
|
+
: row.cwd
|
|
65
|
+
: undefined;
|
|
66
|
+
const truncated = live?.truncated ?? row.truncated;
|
|
67
|
+
return {
|
|
68
|
+
id: row.id,
|
|
69
|
+
kind: row.kind,
|
|
70
|
+
label: row.label,
|
|
71
|
+
status: row.status,
|
|
72
|
+
...(row.command !== undefined ? { command: row.command } : {}),
|
|
73
|
+
...(cwd !== undefined ? { cwd } : {}),
|
|
74
|
+
...(row.exitCode !== undefined ? { exitCode: row.exitCode } : {}),
|
|
75
|
+
...(row.signal !== undefined ? { signal: row.signal } : {}),
|
|
76
|
+
...(row.errorCode !== undefined ? { errorCode: row.errorCode } : {}),
|
|
77
|
+
...(row.abortOrigin !== undefined ? { abortOrigin: row.abortOrigin } : {}),
|
|
78
|
+
sessionId: row.session,
|
|
79
|
+
bytes: live?.bytes ?? row.bytes,
|
|
80
|
+
...(truncated ? { truncated: true } : {}),
|
|
81
|
+
...(row.pid !== undefined ? { pid: row.pid } : {}),
|
|
82
|
+
...(row.timeoutMs !== undefined ? { timeoutMs: row.timeoutMs } : {}),
|
|
83
|
+
createdAt: row.createdAt,
|
|
84
|
+
...(row.startedAt !== undefined ? { startedAt: row.startedAt } : {}),
|
|
85
|
+
...(row.endedAt !== undefined ? { endedAt: row.endedAt } : {}),
|
|
86
|
+
...(row.deliveredAt !== undefined ? { delivered: true } : {}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export class BackgroundTaskStore {
|
|
90
|
+
db;
|
|
91
|
+
constructor(db) {
|
|
92
|
+
this.db = db;
|
|
93
|
+
}
|
|
94
|
+
insert(task) {
|
|
95
|
+
this.db
|
|
96
|
+
.prepare(`INSERT INTO background_tasks(id,session,root_session,workspace,kind,label,command,cwd,status,
|
|
97
|
+
owner_pid,timeout_ms,log_path,bytes,truncated,created_at)
|
|
98
|
+
VALUES(?,?,?,?,'shell',?,?,?,'queued',?,?,?,0,0,?)`)
|
|
99
|
+
.run(task.id, task.session, task.rootSession, task.workspace, task.label, task.command, task.cwd, task.ownerPid, task.timeoutMs, task.logPath, task.createdAt);
|
|
100
|
+
return this.get(task.id);
|
|
101
|
+
}
|
|
102
|
+
get(id) {
|
|
103
|
+
const row = this.db.prepare("SELECT * FROM background_tasks WHERE id=?").get(id);
|
|
104
|
+
return row ? toRow(row) : undefined;
|
|
105
|
+
}
|
|
106
|
+
/** Newest first. */
|
|
107
|
+
list(rootSession, options = {}) {
|
|
108
|
+
const where = options.status?.length ? ` AND status IN (${sqlList(options.status)})` : "";
|
|
109
|
+
return this.db
|
|
110
|
+
.prepare(`SELECT * FROM background_tasks WHERE root_session=?${where}
|
|
111
|
+
ORDER BY created_at DESC, rowid DESC LIMIT ?`)
|
|
112
|
+
.all(rootSession, Math.max(1, Math.min(options.limit ?? 100, 500)))
|
|
113
|
+
.map(toRow);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Compare-and-set: moves the task to `to` only while its status is one of `from`. Returns
|
|
117
|
+
* whether this call made the change (a lost race returns false and changes nothing).
|
|
118
|
+
*/
|
|
119
|
+
transition(id, from, to, patch = {}) {
|
|
120
|
+
const sets = ["status=?"];
|
|
121
|
+
const params = [to];
|
|
122
|
+
const set = (column, value) => {
|
|
123
|
+
if (value === undefined)
|
|
124
|
+
return;
|
|
125
|
+
sets.push(`${column}=?`);
|
|
126
|
+
params.push(typeof value === "boolean" ? (value ? 1 : 0) : value);
|
|
127
|
+
};
|
|
128
|
+
set("exit_code", patch.exitCode);
|
|
129
|
+
set("signal", patch.signal);
|
|
130
|
+
set("error_code", patch.errorCode);
|
|
131
|
+
set("abort_origin", patch.abortOrigin);
|
|
132
|
+
set("started_at", patch.startedAt);
|
|
133
|
+
set("ended_at", patch.endedAt);
|
|
134
|
+
set("bytes", patch.bytes);
|
|
135
|
+
set("truncated", patch.truncated);
|
|
136
|
+
const result = this.db
|
|
137
|
+
.prepare(`UPDATE background_tasks SET ${sets.join(",")} WHERE id=? AND status IN (${sqlList(from)})`)
|
|
138
|
+
.run(...params, id);
|
|
139
|
+
return Number(result.changes) > 0;
|
|
140
|
+
}
|
|
141
|
+
setPid(id, pid) {
|
|
142
|
+
this.db.prepare("UPDATE background_tasks SET pid=? WHERE id=?").run(pid, id);
|
|
143
|
+
}
|
|
144
|
+
/** Progress of a live task (bytes written so far); never touches a terminal row's state. */
|
|
145
|
+
setProgress(id, bytes, truncated) {
|
|
146
|
+
this.db
|
|
147
|
+
.prepare("UPDATE background_tasks SET bytes=?, truncated=? WHERE id=?")
|
|
148
|
+
.run(bytes, truncated ? 1 : 0, id);
|
|
149
|
+
}
|
|
150
|
+
/** Marks the end of a task as told to its owner agent; true only for the first claim. */
|
|
151
|
+
claimDelivery(id, now) {
|
|
152
|
+
const result = this.db
|
|
153
|
+
.prepare("UPDATE background_tasks SET delivered_at=? WHERE id=? AND delivered_at IS NULL")
|
|
154
|
+
.run(now, id);
|
|
155
|
+
return Number(result.changes) > 0;
|
|
156
|
+
}
|
|
157
|
+
/** Undoes a claim whose wake-up did not start (only the claim of `now`). */
|
|
158
|
+
releaseDelivery(id, now) {
|
|
159
|
+
this.db
|
|
160
|
+
.prepare("UPDATE background_tasks SET delivered_at=NULL WHERE id=? AND delivered_at=?")
|
|
161
|
+
.run(id, now);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Startup recovery: tasks left queued, running or stopping by an owner process that no longer
|
|
165
|
+
* exists become `lost`. A task of this process (another application of the same server) or of
|
|
166
|
+
* another LIVE Alisio process is never touched.
|
|
167
|
+
*/
|
|
168
|
+
markLost(now, ownPid = process.pid) {
|
|
169
|
+
const rows = this.db
|
|
170
|
+
.prepare(`SELECT * FROM background_tasks WHERE status IN (${sqlList(LIVE_STATES)})`)
|
|
171
|
+
.all()
|
|
172
|
+
.map(toRow);
|
|
173
|
+
const lost = [];
|
|
174
|
+
for (const row of rows) {
|
|
175
|
+
if (row.ownerPid === ownPid || isProcessAlive(row.ownerPid))
|
|
176
|
+
continue;
|
|
177
|
+
if (this.transition(row.id, LIVE_STATES, "lost", { endedAt: now }))
|
|
178
|
+
lost.push(this.get(row.id));
|
|
179
|
+
}
|
|
180
|
+
return lost;
|
|
181
|
+
}
|
|
182
|
+
/** Terminal tasks that ended before `cutoff`. */
|
|
183
|
+
endedBefore(cutoff) {
|
|
184
|
+
return this.db
|
|
185
|
+
.prepare(`SELECT * FROM background_tasks WHERE status IN (${sqlList(TERMINAL_STATES)})
|
|
186
|
+
AND COALESCE(ended_at, created_at) < ?`)
|
|
187
|
+
.all(cutoff)
|
|
188
|
+
.map(toRow);
|
|
189
|
+
}
|
|
190
|
+
delete(id) {
|
|
191
|
+
this.db
|
|
192
|
+
.prepare(`DELETE FROM background_tasks WHERE id=? AND status IN (${sqlList(TERMINAL_STATES)})`)
|
|
193
|
+
.run(id);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/** The parsed `CHANGELOG.md` shipped with the package (newest entry first). */
|
|
2
|
+
export const CHANGELOG_DATA = {
|
|
3
|
+
schema: 1,
|
|
4
|
+
entries: [
|
|
5
|
+
{
|
|
6
|
+
version: "0.1.1",
|
|
7
|
+
date: "2026-10-03",
|
|
8
|
+
sections: [
|
|
9
|
+
{
|
|
10
|
+
title: "Fixed",
|
|
11
|
+
items: [
|
|
12
|
+
"The web UI no longer scrolls the page and leaves a blank gap under the interface while a reply is streaming: the app now always fills the window exactly and only its inner panels scroll.",
|
|
13
|
+
"The Alisio version is shown in the web UI: **Settings → About** and, discreetly, the bottom of the sidebar.",
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
version: "0.1.0",
|
|
20
|
+
date: "2026-10-02",
|
|
21
|
+
sections: [
|
|
22
|
+
{
|
|
23
|
+
title: "Added",
|
|
24
|
+
items: [
|
|
25
|
+
"The terminal UI and `alisio serve`, a local web UI with several sessions and workspaces at once, streaming, approvals, themes and English/Spanish; both run the same agent core.",
|
|
26
|
+
"Agents: define your own in `.agents/agents`, manage them with `/agents` (terminal and web) and switch with `/agent:<id>`; Shift+Tab cycles the main agents (build, plan and your own) in the terminal and the web composer.",
|
|
27
|
+
"Plan mode with plan review: the agent proposes a plan with `exit_plan` and you approve or revise it before anything changes.",
|
|
28
|
+
"`/permission` (also `/permissions`) switches between ask, auto and full-access modes, and saved permissions are reviewed and revoked from the same menu.",
|
|
29
|
+
"Python analysis: the agent writes and runs a script and publishes its outputs as artifacts (dashboards, reports, charts, spreadsheets); `/artifacts` lists them and the web shows them in an artifact panel.",
|
|
30
|
+
"Tabular datasets: attach CSV, TSV or XLSX files and the agent inspects and queries them; the web has a table viewer.",
|
|
31
|
+
"Background tasks: long commands keep running while you work; `/tasks` lists, inspects and stops them.",
|
|
32
|
+
"`/goal <objective>` keeps the agent working on one objective, turn after turn, with a token budget (`budget=50k`), turn and time limits, and breakers for repeated replies; it never runs in plan mode and waits for approvals, questions and background tasks.",
|
|
33
|
+
"`/reload` reloads the configuration, agents, skills, prompt templates and MCP servers between turns; a broken configuration leaves your session untouched.",
|
|
34
|
+
"`/changelog [version]` shows what changed in each release, and Alisio mentions the news once after an upgrade.",
|
|
35
|
+
"A Memory tab in the web UI and plugin-provided data views.",
|
|
36
|
+
"`/btw` asks a side question about the session without adding it to the conversation.",
|
|
37
|
+
"Approved access to directories outside the workspace (`--add-dir`, or an approval per directory).",
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
title: "Improved",
|
|
42
|
+
items: [
|
|
43
|
+
"Live run progress in the terminal and the web: what the run is doing, how long it has been quiet and the last activity.",
|
|
44
|
+
"A request that stays silent until the first-token limit is retried once and then ends with a readable error.",
|
|
45
|
+
"The output limit of each request comes from the maximum the model declares in its catalog, when the provider reports it.",
|
|
46
|
+
"Rich renderers for code, diffs, terminal output, JSON, test results, Mermaid diagrams and formulas.",
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
title: "Fixed",
|
|
51
|
+
items: [
|
|
52
|
+
"A model reply that is cut off at the output limit is continued automatically instead of failing the turn.",
|
|
53
|
+
"Project plugins, skills and MCP servers are merged with your global configuration instead of replacing it.",
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
version: "0.1.0-alpha.28",
|
|
60
|
+
date: "2026-10-01",
|
|
61
|
+
sections: [
|
|
62
|
+
{
|
|
63
|
+
title: "Added",
|
|
64
|
+
items: [
|
|
65
|
+
"A model reply that is cut off at the output limit is continued automatically instead of failing the turn.",
|
|
66
|
+
"A model request that stays silent until the first-token limit is retried once before it fails.",
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
title: "Changed",
|
|
71
|
+
items: [
|
|
72
|
+
"The output limit of each request now comes from the maximum the model declares, when the provider reports it.",
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
version: "0.1.0-alpha.27",
|
|
79
|
+
date: "2026-10-01",
|
|
80
|
+
sections: [
|
|
81
|
+
{
|
|
82
|
+
title: "Added",
|
|
83
|
+
items: [
|
|
84
|
+
"Live run progress in the terminal and the web: what the run is doing, how long it has been quiet and the last activity.",
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
title: "Changed",
|
|
89
|
+
items: [
|
|
90
|
+
"A silent model request now ends with a readable error, and the timeout defaults were adjusted.",
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
version: "0.1.0-alpha.26",
|
|
97
|
+
date: "2026-10-01",
|
|
98
|
+
sections: [
|
|
99
|
+
{
|
|
100
|
+
title: "Added",
|
|
101
|
+
items: [
|
|
102
|
+
"Python analysis: the agent can write and run a script and publish its outputs as downloadable artifacts (dashboards, reports, charts, spreadsheets).",
|
|
103
|
+
"`/artifacts` lists and opens a session's artifacts; the web shows them as cards with a side panel.",
|
|
104
|
+
"`/permissions` reviews and revokes the permissions you saved for a session.",
|
|
105
|
+
"Tabular data in the web: attach CSV, TSV or XLSX files and the agent inspects and queries them.",
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
version: "0.1.0-alpha.25",
|
|
112
|
+
date: "2026-09-30",
|
|
113
|
+
sections: [
|
|
114
|
+
{
|
|
115
|
+
title: "Changed",
|
|
116
|
+
items: [
|
|
117
|
+
"The Agents window of the web UI can be maximized and keeps its scrollbar inside the corners.",
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
version: "0.1.0-alpha.24",
|
|
124
|
+
date: "2026-09-30",
|
|
125
|
+
sections: [
|
|
126
|
+
{
|
|
127
|
+
title: "Added",
|
|
128
|
+
items: [
|
|
129
|
+
"Manage agents without leaving Alisio: `/agents` creates, edits and deletes agent files from templates, in the terminal and in the web Agents window.",
|
|
130
|
+
"`/agent:<id>` activates an agent from the slash menu.",
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
version: "0.1.0-alpha.23",
|
|
137
|
+
date: "2026-09-30",
|
|
138
|
+
sections: [
|
|
139
|
+
{
|
|
140
|
+
title: "Changed",
|
|
141
|
+
items: [
|
|
142
|
+
"Refreshed branding across the terminal and the web, with an About page in the web settings.",
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
version: "0.1.0-alpha.22",
|
|
149
|
+
date: "2026-09-30",
|
|
150
|
+
sections: [
|
|
151
|
+
{
|
|
152
|
+
title: "Added",
|
|
153
|
+
items: [
|
|
154
|
+
"`/btw` asks a side question about the session without adding it to the conversation, in the terminal and in the web.",
|
|
155
|
+
"Archive workspaces in the web sidebar and pick a folder with the native folder dialog.",
|
|
156
|
+
"A redesigned stop control in the web composer and the official logo and favicon.",
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
version: "0.1.0-alpha.21",
|
|
163
|
+
date: "2026-09-30",
|
|
164
|
+
sections: [
|
|
165
|
+
{
|
|
166
|
+
title: "Added",
|
|
167
|
+
items: [
|
|
168
|
+
"`alisio serve` starts a local web UI with several sessions and workspaces at once, streaming, approvals, themes and English/Spanish.",
|
|
169
|
+
"Rich renderers for code, diffs, terminal output, JSON, test results, Mermaid diagrams and formulas, plus a files panel and a trajectory tab.",
|
|
170
|
+
"Image attachments in the web composer.",
|
|
171
|
+
"Manage plugins, skills, MCP servers, agent presets, providers and models from the web settings.",
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
version: "0.1.0-alpha.20",
|
|
178
|
+
date: "2026-09-30",
|
|
179
|
+
sections: [
|
|
180
|
+
{
|
|
181
|
+
title: "Added",
|
|
182
|
+
items: [
|
|
183
|
+
"Approved access to directories outside the workspace (`--add-dir`, or an approval per directory).",
|
|
184
|
+
"A configurable inset for the transcript in the terminal (`/settings`).",
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
version: "0.1.0-alpha.19",
|
|
191
|
+
date: "2026-09-29",
|
|
192
|
+
sections: [
|
|
193
|
+
{
|
|
194
|
+
title: "Changed",
|
|
195
|
+
items: [
|
|
196
|
+
"External provider plugins moved to the separate alisio-plugins repository; `@alisio/plugin-openai-compatible` stays built in.",
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
version: "0.1.0-alpha.18",
|
|
203
|
+
date: "2026-09-28",
|
|
204
|
+
sections: [
|
|
205
|
+
{
|
|
206
|
+
title: "Fixed",
|
|
207
|
+
items: [
|
|
208
|
+
"Project plugins, skills and MCP servers are merged with your global configuration instead of replacing it.",
|
|
209
|
+
],
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
version: "0.1.0-alpha.17",
|
|
215
|
+
date: "2026-09-28",
|
|
216
|
+
sections: [
|
|
217
|
+
{
|
|
218
|
+
title: "Added",
|
|
219
|
+
items: ["Plugins declare categories, and the plugin picker groups them under headers."],
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
version: "0.1.0-alpha.16",
|
|
225
|
+
date: "2026-09-27",
|
|
226
|
+
sections: [
|
|
227
|
+
{
|
|
228
|
+
title: "Added",
|
|
229
|
+
items: [
|
|
230
|
+
"Rich MCP results, syntax highlighting in Markdown and clearer presentation of tool calls.",
|
|
231
|
+
],
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
version: "0.1.0-alpha.15",
|
|
237
|
+
date: "2026-09-27",
|
|
238
|
+
sections: [
|
|
239
|
+
{
|
|
240
|
+
title: "Added",
|
|
241
|
+
items: [
|
|
242
|
+
"Active agents: `/agents` switches the main agent, and `/effort` sets the reasoning effort.",
|
|
243
|
+
"The status line below the editor shows the agent, model, provider and effort.",
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
version: "0.1.0-alpha.14",
|
|
250
|
+
date: "2026-09-27",
|
|
251
|
+
sections: [
|
|
252
|
+
{
|
|
253
|
+
title: "Added",
|
|
254
|
+
items: ["A DuckDuckGo web search provider that needs no API key."],
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
version: "0.1.0-alpha.13",
|
|
260
|
+
date: "2026-09-26",
|
|
261
|
+
sections: [
|
|
262
|
+
{
|
|
263
|
+
title: "Added",
|
|
264
|
+
items: [
|
|
265
|
+
"A soft turn limit that lets the agent finish gracefully, and richer package READMEs.",
|
|
266
|
+
],
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
title: "Changed",
|
|
270
|
+
items: ["The header shows the model, provider and workspace identity."],
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
version: "0.1.0-alpha.12",
|
|
276
|
+
date: "2026-09-26",
|
|
277
|
+
sections: [
|
|
278
|
+
{
|
|
279
|
+
title: "Fixed",
|
|
280
|
+
items: [
|
|
281
|
+
"Output-budget defaults, a cap on the context sent to the model and faster exit.",
|
|
282
|
+
],
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
title: "Added",
|
|
286
|
+
items: ["The header shows the Git branch of the workspace."],
|
|
287
|
+
},
|
|
288
|
+
],
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
version: "0.1.0-alpha.1",
|
|
292
|
+
date: "2026-09-25",
|
|
293
|
+
sections: [
|
|
294
|
+
{
|
|
295
|
+
title: "Added",
|
|
296
|
+
items: [
|
|
297
|
+
"Terminal UI for any OpenAI-compatible endpoint, with permissioned local tools, context compaction and persistent memory.",
|
|
298
|
+
"Subagents, `ask_user_question`, web tools, per-directory project trust and pasting text or images into the editor.",
|
|
299
|
+
"Providers, MCP servers and skills managers, `/settings`, slash completion for skills and an npm plugin installer.",
|
|
300
|
+
"A context bar that follows the model's real window, with per-profile overrides for local servers.",
|
|
301
|
+
],
|
|
302
|
+
},
|
|
303
|
+
],
|
|
304
|
+
},
|
|
305
|
+
],
|
|
306
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The shipped changelog: parsed from `CHANGELOG.md` at build time, available offline. */
|
|
2
|
+
import type { ChangelogEntry } from "@alisio/sdk";
|
|
3
|
+
export { changelogNews, compareVersions, formatChangelogMarkdown, isVersion, type NewsDecision, parseChangelog, type SelectedEntries, selectEntries, UNRELEASED, } from "./parse.ts";
|
|
4
|
+
/** Every entry of the shipped changelog, newest first as written in the file. */
|
|
5
|
+
export declare function loadChangelog(): ChangelogEntry[];
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CHANGELOG_DATA } from "./data.js";
|
|
2
|
+
export { changelogNews, compareVersions, formatChangelogMarkdown, isVersion, parseChangelog, selectEntries, UNRELEASED, } from "./parse.js";
|
|
3
|
+
/** Every entry of the shipped changelog, newest first as written in the file. */
|
|
4
|
+
export function loadChangelog() {
|
|
5
|
+
const data = CHANGELOG_DATA;
|
|
6
|
+
return data.schema === 1 && Array.isArray(data.entries) ? data.entries : [];
|
|
7
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure parser and version helpers of `CHANGELOG.md` (Keep a Changelog, reduced). No I/O and no
|
|
3
|
+
* runtime imports, so the build script can load it with `node --experimental-strip-types`.
|
|
4
|
+
*
|
|
5
|
+
* Format: `## [Unreleased]` or `## [<version>] - <date>`, then `### Added|Changed|Fixed`
|
|
6
|
+
* sections of `- ` bullets (a continuation line indented under a bullet extends it). Anything
|
|
7
|
+
* outside an entry (the title, the introduction) is ignored; entries keep the file order.
|
|
8
|
+
*/
|
|
9
|
+
import type { ChangelogEntry } from "@alisio/sdk";
|
|
10
|
+
export declare const UNRELEASED = "Unreleased";
|
|
11
|
+
export declare function parseChangelog(markdown: string): ChangelogEntry[];
|
|
12
|
+
/** Whether `text` is a semantic version (`1.2.3-alpha.4`, with an optional leading `v`). */
|
|
13
|
+
export declare const isVersion: (text: string) => boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Semver order with numeric prerelease identifiers (`alpha.9` < `alpha.10`; a release is above its
|
|
16
|
+
* prereleases). `Unreleased` is above every version; an unparseable text sorts below all of them.
|
|
17
|
+
*/
|
|
18
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
19
|
+
export interface SelectedEntries {
|
|
20
|
+
entries: ChangelogEntry[];
|
|
21
|
+
/** `false` when a version was asked for and no entry has it. */
|
|
22
|
+
found: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The entries to show: the `limit` newest (default 5), or the one named by `version` (`alpha.4`,
|
|
26
|
+
* `1.2.3-alpha.4` and `v1.2.3-alpha.4` all match). Entries come back newest first.
|
|
27
|
+
*/
|
|
28
|
+
export declare function selectEntries(entries: ChangelogEntry[], options?: {
|
|
29
|
+
version?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
}): SelectedEntries;
|
|
32
|
+
export interface NewsDecision {
|
|
33
|
+
/** Show the one-line "updated" notice. */
|
|
34
|
+
show: boolean;
|
|
35
|
+
/** Versions newer than `lastSeen` up to `current`, newest first. */
|
|
36
|
+
versions: string[];
|
|
37
|
+
latest?: string;
|
|
38
|
+
/** The viewer should now store `current` as its last seen version. */
|
|
39
|
+
record: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Decides the discreet "Alisio updated" line. A first run (no `lastSeen`) stays silent and records;
|
|
43
|
+
* the same version does nothing; a downgrade or an upgrade without entries records silently;
|
|
44
|
+
* an upgrade with entries in `(lastSeen, current]` shows. `Unreleased` never counts as news and an
|
|
45
|
+
* unparseable `current` (a development build) does nothing.
|
|
46
|
+
*/
|
|
47
|
+
export declare function changelogNews(input: {
|
|
48
|
+
entries: ChangelogEntry[];
|
|
49
|
+
current: string;
|
|
50
|
+
lastSeen?: string | undefined;
|
|
51
|
+
}): NewsDecision;
|
|
52
|
+
/** Markdown for the entries (one `##` heading per version, bold section titles, bullets). */
|
|
53
|
+
export declare function formatChangelogMarkdown(entries: ChangelogEntry[]): string;
|