strom-research 1.27.0-beta.3 → 1.27.0-beta.4
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.cs.md +4 -3
- package/CHANGELOG.de.md +4 -3
- package/CHANGELOG.md +4 -3
- package/CHANGELOG.pl.md +4 -3
- package/dist/commands/session.js +10 -9
- package/dist/core/tree.js +1 -1
- package/dist/core/writable.js +20 -2
- package/dist/runners/codex.js +23 -2
- package/package.json +1 -1
package/CHANGELOG.cs.md
CHANGED
|
@@ -7,7 +7,7 @@ Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou n
|
|
|
7
7
|
|
|
8
8
|
## 1.27.0
|
|
9
9
|
|
|
10
|
-
*Připravuje se: bety do 1.27.0-beta.
|
|
10
|
+
*Připravuje se: bety do 1.27.0-beta.4. Oddíl bude úplný s vydáním.*
|
|
11
11
|
|
|
12
12
|
- **Snímky uložené ručně vrátí svůj úkol samy.** Kde se snímky archivu ukládají ručně – archiv, kam smí jen prohlížeč
|
|
13
13
|
člověka, nebo archiv, jehož podmínky nic jiného nedovolují – výzkum požádá o knihu a čísla snímků a připraví pro ně
|
|
@@ -60,8 +60,9 @@ Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou n
|
|
|
60
60
|
spustit?“. Podmínka týdne předplatného uvádí využití za týden proti tomu, co je zatím dovoleno, a jak se počítá.
|
|
61
61
|
`strom help --human` uvádí pořadí úkolů, práci mimo linie, opravy a ponechání rozporu mezi příkazy člověka. Výzkum s
|
|
62
62
|
OpenCode pokračuje i po sezení, které OpenCode řádně uzavřel, ale ohlásil jako neúspěšné, a po přechodné chybě sítě –
|
|
63
|
-
totéž sezení se po krátkém čekání obnoví, v rámci času sezení. Když sandbox Codexu nepustí strom k výzkumu –
|
|
64
|
-
Windows i u příkazu zadaného přes PowerShell –, výzkum se hned zastaví s tím, co zůstává volbou člověka,
|
|
63
|
+
totéž sezení se po krátkém čekání obnoví, v rámci času sezení. Když sandbox Codexu nepustí strom k výzkumu – i v
|
|
64
|
+
rouře a na Windows i u příkazu zadaného přes PowerShell –, výzkum se hned zastaví s tím, co zůstává volbou člověka,
|
|
65
|
+
a takové
|
|
65
66
|
sezení úkol nikdy neodloží. Díky za hlášení na GitHubu. Změnu čtení snímků, kterou výzkum udělal sám a po které se
|
|
66
67
|
četlo zřetelně méně jistě, hned vrátí – už ne až po 60 dnech – a `strom recent` to uvede.
|
|
67
68
|
|
package/CHANGELOG.de.md
CHANGED
|
@@ -7,7 +7,7 @@ Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Ins
|
|
|
7
7
|
|
|
8
8
|
## 1.27.0
|
|
9
9
|
|
|
10
|
-
*In Vorbereitung: die Betas bis 1.27.0-beta.
|
|
10
|
+
*In Vorbereitung: die Betas bis 1.27.0-beta.4. Der Abschnitt ist mit dem Release vollständig.*
|
|
11
11
|
|
|
12
12
|
- **Von Hand gespeicherte Bilder bringen ihre Aufgabe von selbst zurück.** Wo die Bilder eines Archivs von Hand
|
|
13
13
|
gespeichert werden – ein Archiv, das nur der Browser eines Menschen erreicht, oder eines, dessen Bedingungen nichts
|
|
@@ -74,8 +74,9 @@ Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Ins
|
|
|
74
74
|
abseits der Linien, Korrekturen und das Belassen eines Widerspruchs unter den eigenen Befehlen des Menschen. Die
|
|
75
75
|
Forschung mit OpenCode geht weiter nach einer Sitzung, die es ordnungsgemäß abgeschlossen, aber als fehlgeschlagen
|
|
76
76
|
gemeldet hat, und nach einem vorübergehenden Netzwerkfehler – dieselbe Sitzung wird nach kurzem Warten fortgesetzt,
|
|
77
|
-
innerhalb der Zeit der Sitzung. Hält die Sandbox von Codex strom von der Forschung fern –
|
|
78
|
-
über PowerShell gegebenen Befehl –, hält die Forschung sofort an und nennt, was die Wahl
|
|
77
|
+
innerhalb der Zeit der Sitzung. Hält die Sandbox von Codex strom von der Forschung fern – auch in einer Pipe und
|
|
78
|
+
unter Windows auch bei einem über PowerShell gegebenen Befehl –, hält die Forschung sofort an und nennt, was die Wahl
|
|
79
|
+
des Menschen bleibt; eine
|
|
79
80
|
solche Sitzung legt ihre Aufgabe nie beiseite. Danke für die Meldung auf GitHub. Eine Änderung beim Lesen der Scans,
|
|
80
81
|
die die Forschung selbst vorgenommen hat und nach der die Lesungen deutlich unsicherer wurden, wird sofort
|
|
81
82
|
zurückgenommen – nicht mehr erst nach 60 Tagen –, und `strom recent` sagt es.
|
package/CHANGELOG.md
CHANGED
|
@@ -7,7 +7,7 @@ The changes of each version in short. The full notes and the install lines are o
|
|
|
7
7
|
|
|
8
8
|
## 1.27.0
|
|
9
9
|
|
|
10
|
-
*In preparation: the betas up to 1.27.0-beta.
|
|
10
|
+
*In preparation: the betas up to 1.27.0-beta.4. The section is complete with the release.*
|
|
11
11
|
|
|
12
12
|
- **Images saved by hand bring their task back by themselves.** Where an archive's images are saved by hand – an archive
|
|
13
13
|
only a person's browser reaches, or one whose terms allow nothing else – the research asks for its book and the
|
|
@@ -65,8 +65,9 @@ The changes of each version in short. The full notes and the install lines are o
|
|
|
65
65
|
counted. `strom help --human` lists the order of tasks, work off the lines, fixes and leaving a conflict among the
|
|
66
66
|
person's own commands. OpenCode's research goes on after a session it closed properly but reported as failed, and
|
|
67
67
|
after a passing network error – the same session resumed after a short wait, within the session's time. Codex kept
|
|
68
|
-
away from strom by its sandbox – on Windows
|
|
69
|
-
with what remains the person's choice, and such a session never puts its task aside. Thanks for the
|
|
68
|
+
away from strom by its sandbox – also in a pipe, and on Windows with a command said through PowerShell – stops the
|
|
69
|
+
research at once with what remains the person's choice, and such a session never puts its task aside. Thanks for the
|
|
70
|
+
report on GitHub.
|
|
70
71
|
A change the research made by itself in reading the scans, after which the readings got clearly less sure, is taken
|
|
71
72
|
back at once – no longer only after 60 days – and `strom recent` says so.
|
|
72
73
|
|
package/CHANGELOG.pl.md
CHANGED
|
@@ -7,7 +7,7 @@ Zmiany każdej wersji w skrócie. Pełne informacje o wydaniach i polecenia inst
|
|
|
7
7
|
|
|
8
8
|
## 1.27.0
|
|
9
9
|
|
|
10
|
-
*W przygotowaniu: bety do 1.27.0-beta.
|
|
10
|
+
*W przygotowaniu: bety do 1.27.0-beta.4. Sekcja będzie kompletna z wydaniem.*
|
|
11
11
|
|
|
12
12
|
- **Skany zapisane ręcznie same przywracają swoje zadanie.** Tam, gdzie skany archiwum zapisuje się ręcznie – archiwum,
|
|
13
13
|
do którego wolno tylko przeglądarce człowieka, albo takie, którego warunki nie pozwalają na nic innego – badanie
|
|
@@ -67,8 +67,9 @@ Zmiany każdej wersji w skrócie. Pełne informacje o wydaniach i polecenia inst
|
|
|
67
67
|
i jak jest liczone. `strom help --human` wymienia kolejność zadań, pracę poza liniami, poprawki i pozostawienie
|
|
68
68
|
sprzeczności wśród poleceń człowieka. Badanie z OpenCode toczy się dalej po sesji, którą OpenCode poprawnie zamknął,
|
|
69
69
|
ale zgłosił jako nieudaną, oraz po przejściowym błędzie sieci – ta sama sesja zostaje wznowiona po krótkim
|
|
70
|
-
oczekiwaniu, w ramach czasu sesji. Gdy sandbox Codexa nie dopuści strom do badań – w
|
|
71
|
-
podanym przez PowerShell –, badanie od razu się zatrzymuje z tym, co pozostaje wyborem
|
|
70
|
+
oczekiwaniu, w ramach czasu sesji. Gdy sandbox Codexa nie dopuści strom do badań – także w potoku, a w Windows
|
|
71
|
+
także przy poleceniu podanym przez PowerShell –, badanie od razu się zatrzymuje z tym, co pozostaje wyborem
|
|
72
|
+
człowieka, a taka sesja nigdy
|
|
72
73
|
nie odkłada zadania. Dziękujemy za zgłoszenie na GitHubie. Zmiana odczytu skanów, którą badanie wprowadziło samo i po
|
|
73
74
|
której odczyty stały się wyraźnie mniej pewne, zostaje od razu cofnięta – już nie dopiero po 60 dniach – a `strom
|
|
74
75
|
recent` to podaje.
|
package/dist/commands/session.js
CHANGED
|
@@ -1268,15 +1268,6 @@ register(updatedDuringRun({
|
|
|
1268
1268
|
stopCode = "user";
|
|
1269
1269
|
break;
|
|
1270
1270
|
}
|
|
1271
|
-
// An agent that may not run strom can do nothing: stop, do not burn session after session.
|
|
1272
|
-
// A refused command that only starts with strom (strom … && sed …, a loop) is no such thing
|
|
1273
|
-
// when strom worked for it otherwise.
|
|
1274
|
-
if (!ranStrom && stromDenied) {
|
|
1275
|
-
// Codex: its sandbox (strom out of it only as a command of its own, by the research's rules; on Windows .git
|
|
1276
|
-
// closed inside it) — said with what is the person's choice; nothing more is started, the task stays queued
|
|
1277
|
-
stopCode = runnerId === "codex" && permissions !== "full" ? "denied.codex" : "denied";
|
|
1278
|
-
break;
|
|
1279
|
-
}
|
|
1280
1271
|
if (result.outcome === "limit") {
|
|
1281
1272
|
stopCode = "limit";
|
|
1282
1273
|
stopValues = { resets: result.resumeAt ? ui(lang, "ui.run.stop.resets", { at: result.resumeAt }) : "" };
|
|
@@ -1287,6 +1278,16 @@ register(updatedDuringRun({
|
|
|
1287
1278
|
stopValues = { command: runnerId === "claude" ? claudeLoginCommand(runEnv) : runner.command };
|
|
1288
1279
|
break;
|
|
1289
1280
|
}
|
|
1281
|
+
// An agent that may not run strom can do nothing: stop, do not burn session after session.
|
|
1282
|
+
// A refused command that only starts with strom (strom … && sed …, a loop) is no such thing
|
|
1283
|
+
// when strom worked for it otherwise. (The plan's limit and a login gone come first: they ended the session,
|
|
1284
|
+
// the limit said with when it resets; a refusal is met again by the run after them.)
|
|
1285
|
+
if (!ranStrom && stromDenied) {
|
|
1286
|
+
// Codex: its sandbox (strom out of it only as a command of its own, by the research's rules; on Windows .git
|
|
1287
|
+
// closed inside it) — said with what is the person's choice; nothing more is started, the task stays queued
|
|
1288
|
+
stopCode = runnerId === "codex" && permissions !== "full" ? "denied.codex" : "denied";
|
|
1289
|
+
break;
|
|
1290
|
+
}
|
|
1290
1291
|
// the agent does not take its model: said with what to do, never only its raw error
|
|
1291
1292
|
if (result.outcome === "error" && result.modelRejected) {
|
|
1292
1293
|
stopCode = "model";
|
package/dist/core/tree.js
CHANGED
|
@@ -31,7 +31,7 @@ export const TREE_FILE = "strom.json";
|
|
|
31
31
|
export const SEAL_FOREIGN = "seal.foreign";
|
|
32
32
|
// between releases the candidate being made (a bridge run from the sources says what it is: the Strom app goes by it);
|
|
33
33
|
// at a release the release's own (package.json)
|
|
34
|
-
export const VERSION = "1.27.0-beta.
|
|
34
|
+
export const VERSION = "1.27.0-beta.4";
|
|
35
35
|
const GITIGNORE = `# Strom Research — local state and large files are not versioned
|
|
36
36
|
.strom/
|
|
37
37
|
/media/
|
package/dist/core/writable.js
CHANGED
|
@@ -72,6 +72,22 @@ const WINDOWS_HINT = `${FOLDER_HINT} — on Windows, OneDrive or the controlled
|
|
|
72
72
|
export function agentName(id) {
|
|
73
73
|
return AGENTS.find((a) => a.id === id)?.name ?? { cursor: "Cursor", gemini: "Gemini CLI" }[id] ?? id;
|
|
74
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* How strom says it was refused under an agent (fs.sandboxed), word for word: a run reads it in what the agent's command
|
|
77
|
+
* printed — also when the command's exit code is 0 (strom in a pipe: the code is the last program's; found with
|
|
78
|
+
* codex-cli 0.155.1, `strom … | cat` refused by Codex's sandbox ended with 0).
|
|
79
|
+
*/
|
|
80
|
+
export const SANDBOX_REFUSAL = "strom runs under an agent, and most likely its sandbox forbids it";
|
|
81
|
+
/**
|
|
82
|
+
* The mark of the session strom refused in, after SANDBOX_REFUSAL: `(strom session N0042)`, from STROM_SESSION (set by
|
|
83
|
+
* strom run for the agent it starts; Codex hands its commands the environment it was started with). A run reads a
|
|
84
|
+
* refusal where the exit code is 0 (strom in a pipe) only with its own session's mark: the words quoted from another
|
|
85
|
+
* session — a summary in the next strom brief, a note, strom grep — carry that session's mark or none (#8). Undefined:
|
|
86
|
+
* no session, or an id that is none of strom's.
|
|
87
|
+
*/
|
|
88
|
+
export function refusalMark(session) {
|
|
89
|
+
return session && /^[\p{L}\p{N}_-]{1,40}$/u.test(session) ? `(strom session ${session})` : undefined;
|
|
90
|
+
}
|
|
75
91
|
/**
|
|
76
92
|
* A refusal to use a file or folder: under an agent most likely its sandbox (fs.sandboxed) — else no right to write
|
|
77
93
|
* there (fs.no-permission; on Windows OneDrive and the controlled folder access named as what may also do it). `above`:
|
|
@@ -82,8 +98,10 @@ export function agentName(id) {
|
|
|
82
98
|
export function noPermission(where, agent, platform = process.platform, above) {
|
|
83
99
|
const at = where ? `: ${where}` : "";
|
|
84
100
|
const params = where ? { where } : undefined;
|
|
85
|
-
if (agent)
|
|
86
|
-
|
|
101
|
+
if (agent) {
|
|
102
|
+
const mark = refusalMark(agent.STROM_SESSION);
|
|
103
|
+
return new UsageError(`no permission to use${at} — ${SANDBOX_REFUSAL}${mark ? ` ${mark}` : ""}`, { hint: sandboxHint(agent, where), code: "fs.sandboxed", ...(params ? { params } : {}) });
|
|
104
|
+
}
|
|
87
105
|
if (above === "?")
|
|
88
106
|
return new UsageError(`no permission to use${at}`, {
|
|
89
107
|
hint: `strom could not see the programs that started it, as in an agent's sandbox: if an agent started strom, most likely its sandbox forbids it — the command approved outside the sandbox; else ${platform === "win32" ? WINDOWS_HINT : FOLDER_HINT}`,
|
package/dist/runners/codex.js
CHANGED
|
@@ -12,6 +12,7 @@ import { codexConfigFile, codexModel, effortArgs } from "../agents/effort.js";
|
|
|
12
12
|
import { CODEX_BROWSER_SERVERS } from "../core/browser.js";
|
|
13
13
|
import { isolated } from "../core/paths.js";
|
|
14
14
|
import { inRoom, readerRoom } from "./room.js";
|
|
15
|
+
import { refusalMark, SANDBOX_REFUSAL } from "../core/writable.js";
|
|
15
16
|
/**
|
|
16
17
|
* What Codex's sandbox lets it write besides the tree folder: the tree's .git — its sandbox keeps a .git
|
|
17
18
|
* read-only even inside the folder it works in, and every change strom makes is a commit (found live:
|
|
@@ -120,6 +121,20 @@ export function codexWeb(item) {
|
|
|
120
121
|
return typeof action.url === "string" && action.url ? { via: "web", url: action.url, tool: "web_search" } : undefined;
|
|
121
122
|
return { via: "search", tool: "web_search" };
|
|
122
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* strom's own refusal under an agent in what a command printed with the exit code 0 (strom in a pipe: the code is the
|
|
126
|
+
* last program's) — only with the mark of the session it ran in (`<SANDBOX_REFUSAL> (strom session N0042)`,
|
|
127
|
+
* refusalMark): the words quoted — a session's summary in the next strom brief or session show, a note, strom grep,
|
|
128
|
+
* cat, echo — carry another session's mark or none, whatever their lines look like (#8, found 2026-11-05: an agent
|
|
129
|
+
* summed up a refusal in its words, and the next session's strom brief stopped the run). The mark is read in whatever
|
|
130
|
+
* shape a pipe gives strom's error — plain, --json, `jq .` or `jq -r .message`, Windows PowerShell 5.1's own
|
|
131
|
+
* (`strom.cmd : error: …`, wrapped at the console's width: the lines joined again), a dash spoiled by the console's
|
|
132
|
+
* code page (the sentence and the mark are ASCII). No session (a run strom did not start): no refusal read here.
|
|
133
|
+
*/
|
|
134
|
+
export function codexRefusedStrom(output, session) {
|
|
135
|
+
const mark = refusalMark(session);
|
|
136
|
+
return !!mark && output.replace(/\r?\n/g, "").includes(`${SANDBOX_REFUSAL} ${mark}`);
|
|
137
|
+
}
|
|
123
138
|
/** The error Codex said last, kept when an earlier one said the plan's limit (the later one may only say the turn failed). */
|
|
124
139
|
function failure(said, had) {
|
|
125
140
|
return looksLikeLimit(had).limit && !looksLikeLimit(said).limit ? had : said || had;
|
|
@@ -167,10 +182,16 @@ function runCodex(opts) {
|
|
|
167
182
|
}
|
|
168
183
|
// The sandbox refused a command (a write outside the tree, .git closed, the network off — strom's own refusal says
|
|
169
184
|
// "sandbox", Windows "access is denied"), or Codex did not run it (its rules, an approval nobody gives in exec:
|
|
170
|
-
// "declined"): counted like a denial, the command as the agent meant it (its shell around it taken off)
|
|
185
|
+
// "declined"): counted like a denial, the command as the agent meant it (its shell around it taken off). strom's own
|
|
186
|
+
// refusal under an agent counts with the exit code 0 too: in a pipe (`strom … | cat`, `| Select-Object`) the code
|
|
187
|
+
// is the last program's — but then only strom's error with this session's mark, never its words quoted
|
|
188
|
+
// (codexRefusedStrom). (Codex 0.155's exec_command says nothing at all of a command it refused before it ran — its
|
|
189
|
+
// rules — or one its sandbox stopped within 150 ms; strom itself starts slower and is always said.)
|
|
171
190
|
if (msg.type === "item.completed" &&
|
|
172
191
|
item?.type === "command_execution" &&
|
|
173
|
-
(item.status === "declined" ||
|
|
192
|
+
(item.status === "declined" ||
|
|
193
|
+
(item.exit_code !== 0 && ((item.aggregated_output ?? "").includes(SANDBOX_REFUSAL) || /operation not permitted|sandbox|read-only file system|access (?:to the path .{1,200} )?is denied/i.test(item.aggregated_output ?? ""))) ||
|
|
194
|
+
(item.exit_code === 0 && codexRefusedStrom(item.aggregated_output ?? "", opts.env?.STROM_SESSION))))
|
|
174
195
|
heard.denied.push(`Bash: ${shellUnwrapped(String(item.command ?? "")).slice(0, 120)}`);
|
|
175
196
|
// its web search, once its item is done (counted after the fact: core/metrics.ts)
|
|
176
197
|
if (msg.type === "item.completed") {
|