koppler 0.0.0-stage → 0.0.2
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 +21 -0
- package/README.md +101 -2
- package/bin/run-logged +16 -0
- package/bin/secret-list +7 -0
- package/bin/secret-psql +41 -0
- package/bin/secret-set +17 -0
- package/bin/secret-store +82 -0
- package/bin/secret-test +10 -0
- package/bin/with-secrets +25 -0
- package/dist/.built +1 -0
- package/dist/cli/agent.js +144 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/doctor.js +173 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/mcp.js +204 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/output.js +37 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/records.js +121 -0
- package/dist/cli/records.js.map +1 -0
- package/dist/cli/running.js +270 -0
- package/dist/cli/running.js.map +1 -0
- package/dist/cli/shell.js +43 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/cli/wait.js +59 -0
- package/dist/cli/wait.js.map +1 -0
- package/dist/core/addresses.js +55 -0
- package/dist/core/addresses.js.map +1 -0
- package/dist/core/arrange.js +329 -0
- package/dist/core/arrange.js.map +1 -0
- package/dist/core/cables.js +158 -0
- package/dist/core/cables.js.map +1 -0
- package/dist/core/expressions.js +72 -0
- package/dist/core/expressions.js.map +1 -0
- package/dist/core/frameworks.js +13 -0
- package/dist/core/frameworks.js.map +1 -0
- package/dist/core/kinds.js +244 -0
- package/dist/core/kinds.js.map +1 -0
- package/dist/core/launch.js +181 -0
- package/dist/core/launch.js.map +1 -0
- package/dist/core/logfmt.js +144 -0
- package/dist/core/logfmt.js.map +1 -0
- package/dist/core/mock.js +27 -0
- package/dist/core/mock.js.map +1 -0
- package/dist/core/plan.js +147 -0
- package/dist/core/plan.js.map +1 -0
- package/dist/core/ports.js +155 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/presets.js +186 -0
- package/dist/core/presets.js.map +1 -0
- package/dist/core/secret-types.js +3 -0
- package/dist/core/secret-types.js.map +1 -0
- package/dist/core/sign-in.js +30 -0
- package/dist/core/sign-in.js.map +1 -0
- package/dist/core/stack-path.js +64 -0
- package/dist/core/stack-path.js.map +1 -0
- package/dist/core/stack.js +509 -0
- package/dist/core/stack.js.map +1 -0
- package/dist/core/terraform.js +393 -0
- package/dist/core/terraform.js.map +1 -0
- package/dist/data.js +37 -0
- package/dist/data.js.map +1 -0
- package/dist/engine/actions.js +99 -0
- package/dist/engine/actions.js.map +1 -0
- package/dist/engine/app-commands.js +106 -0
- package/dist/engine/app-commands.js.map +1 -0
- package/dist/engine/app-start.js +167 -0
- package/dist/engine/app-start.js.map +1 -0
- package/dist/engine/app-state.js +43 -0
- package/dist/engine/app-state.js.map +1 -0
- package/dist/engine/boards.js +219 -0
- package/dist/engine/boards.js.map +1 -0
- package/dist/engine/branch.js +194 -0
- package/dist/engine/branch.js.map +1 -0
- package/dist/engine/browser-console.js +45 -0
- package/dist/engine/browser-console.js.map +1 -0
- package/dist/engine/calls.js +97 -0
- package/dist/engine/calls.js.map +1 -0
- package/dist/engine/checks.js +270 -0
- package/dist/engine/checks.js.map +1 -0
- package/dist/engine/clones.js +67 -0
- package/dist/engine/clones.js.map +1 -0
- package/dist/engine/config.js +26 -0
- package/dist/engine/config.js.map +1 -0
- package/dist/engine/deployed.js +488 -0
- package/dist/engine/deployed.js.map +1 -0
- package/dist/engine/devices.js +81 -0
- package/dist/engine/devices.js.map +1 -0
- package/dist/engine/discover.js +236 -0
- package/dist/engine/discover.js.map +1 -0
- package/dist/engine/down.js +253 -0
- package/dist/engine/down.js.map +1 -0
- package/dist/engine/history.js +215 -0
- package/dist/engine/history.js.map +1 -0
- package/dist/engine/investigate.js +278 -0
- package/dist/engine/investigate.js.map +1 -0
- package/dist/engine/libraries.js +129 -0
- package/dist/engine/libraries.js.map +1 -0
- package/dist/engine/linked.js +146 -0
- package/dist/engine/linked.js.map +1 -0
- package/dist/engine/listen.js +223 -0
- package/dist/engine/listen.js.map +1 -0
- package/dist/engine/locks.js +38 -0
- package/dist/engine/locks.js.map +1 -0
- package/dist/engine/messages.js +177 -0
- package/dist/engine/messages.js.map +1 -0
- package/dist/engine/needs.js +363 -0
- package/dist/engine/needs.js.map +1 -0
- package/dist/engine/processes.js +350 -0
- package/dist/engine/processes.js.map +1 -0
- package/dist/engine/query.js +241 -0
- package/dist/engine/query.js.map +1 -0
- package/dist/engine/queues.js +100 -0
- package/dist/engine/queues.js.map +1 -0
- package/dist/engine/recipes.js +248 -0
- package/dist/engine/recipes.js.map +1 -0
- package/dist/engine/reload.js +32 -0
- package/dist/engine/reload.js.map +1 -0
- package/dist/engine/repos.js +214 -0
- package/dist/engine/repos.js.map +1 -0
- package/dist/engine/research.js +134 -0
- package/dist/engine/research.js.map +1 -0
- package/dist/engine/run-logs.js +79 -0
- package/dist/engine/run-logs.js.map +1 -0
- package/dist/engine/run.js +54 -0
- package/dist/engine/run.js.map +1 -0
- package/dist/engine/runs.js +223 -0
- package/dist/engine/runs.js.map +1 -0
- package/dist/engine/session.js +130 -0
- package/dist/engine/session.js.map +1 -0
- package/dist/engine/share.js +124 -0
- package/dist/engine/share.js.map +1 -0
- package/dist/engine/stack-file.js +206 -0
- package/dist/engine/stack-file.js.map +1 -0
- package/dist/engine/stack-share.js +86 -0
- package/dist/engine/stack-share.js.map +1 -0
- package/dist/engine/stacks.js +143 -0
- package/dist/engine/stacks.js.map +1 -0
- package/dist/engine/sync.js +214 -0
- package/dist/engine/sync.js.map +1 -0
- package/dist/engine/traces.js +65 -0
- package/dist/engine/traces.js.map +1 -0
- package/dist/engine/up.js +621 -0
- package/dist/engine/up.js.map +1 -0
- package/dist/engine/watch.js +71 -0
- package/dist/engine/watch.js.map +1 -0
- package/dist/engine/wire.js +120 -0
- package/dist/engine/wire.js.map +1 -0
- package/dist/failure.js +16 -0
- package/dist/failure.js.map +1 -0
- package/dist/github.js +95 -0
- package/dist/github.js.map +1 -0
- package/dist/ids.js +6 -0
- package/dist/ids.js.map +1 -0
- package/dist/json-files.js +36 -0
- package/dist/json-files.js.map +1 -0
- package/dist/koppler.mjs +840 -0
- package/dist/koppler.mjs.map +1 -0
- package/dist/lambda-local.mjs +250 -0
- package/dist/lambda-local.mjs.map +1 -0
- package/dist/lambda-secrets-proxy.go +31 -0
- package/dist/mock-server.mjs +23 -0
- package/dist/mock-server.mjs.map +1 -0
- package/dist/page/assets/JetBrainsMono-cyrillic-D2jMJ_bk.woff2 +0 -0
- package/dist/page/assets/JetBrainsMono-greek-D2nYnAec.woff2 +0 -0
- package/dist/page/assets/JetBrainsMono-latin-Db4Uuiha.woff2 +0 -0
- package/dist/page/assets/JetBrainsMono-latin-ext-Bnd2h4Br.woff2 +0 -0
- package/dist/page/assets/JetBrainsMono-vietnamese-CNlsqbWb.woff2 +0 -0
- package/dist/page/assets/SchibstedGrotesk-latin-DxefFeRw.woff2 +0 -0
- package/dist/page/assets/SchibstedGrotesk-latin-ext-CnpJE18X.woff2 +0 -0
- package/dist/page/assets/index-Bkj_pX35.js +42 -0
- package/dist/page/assets/index-Dq45jswH.css +1 -0
- package/dist/page/index.html +14 -0
- package/dist/page/theme.js +8 -0
- package/dist/paths.js +19 -0
- package/dist/paths.js.map +1 -0
- package/dist/safe-env.js +73 -0
- package/dist/safe-env.js.map +1 -0
- package/dist/sam-local.mjs +135 -0
- package/dist/sam-local.mjs.map +1 -0
- package/dist/scrub.js +87 -0
- package/dist/scrub.js.map +1 -0
- package/dist/secret-check.mjs +262 -0
- package/dist/secret-check.mjs.map +1 -0
- package/dist/server/browser-console.js +117 -0
- package/dist/server/browser-console.js.map +1 -0
- package/dist/server/cable-test.js +365 -0
- package/dist/server/cable-test.js.map +1 -0
- package/dist/server/choices.js +51 -0
- package/dist/server/choices.js.map +1 -0
- package/dist/server/files.js +107 -0
- package/dist/server/files.js.map +1 -0
- package/dist/server/gate.js +128 -0
- package/dist/server/gate.js.map +1 -0
- package/dist/server/logs.js +76 -0
- package/dist/server/logs.js.map +1 -0
- package/dist/server/mobile.js +113 -0
- package/dist/server/mobile.js.map +1 -0
- package/dist/server/routes.js +326 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/runs.js +111 -0
- package/dist/server/runs.js.map +1 -0
- package/dist/server/sanitize.js +242 -0
- package/dist/server/sanitize.js.map +1 -0
- package/dist/server/secrets.js +111 -0
- package/dist/server/secrets.js.map +1 -0
- package/dist/server/status.js +321 -0
- package/dist/server/status.js.map +1 -0
- package/dist/server/token.js +38 -0
- package/dist/server/token.js.map +1 -0
- package/dist/server/waiting.js +79 -0
- package/dist/server/waiting.js.map +1 -0
- package/dist/status-watch.mjs +63 -0
- package/dist/status-watch.mjs.map +1 -0
- package/package.json +74 -4
- package/skills/koppler-run/SKILL.md +169 -0
- package/skills/koppler-run/VERSION +1 -0
- package/skills/koppler-run/references/action-log.md +50 -0
- package/skills/koppler-run/references/permissions.md +25 -0
- package/skills/koppler-run/references/preparing-nodes.md +62 -0
- package/skills/koppler-run/references/reporting-bugs.md +76 -0
- package/skills/koppler-run/references/research.md +40 -0
- package/skills/koppler-run/references/secrets.md +56 -0
- package/skills/koppler-run/references/stack.md +197 -0
- package/skills/koppler-run/references/status.md +92 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// Stop and revert: stop what Koppler runs, undo the action log in reverse (code edits, env-file lines, launch profiles,
|
|
2
|
+
// then branches back with set-aside changes), and look for temporary edits nobody logged. What cannot be undone safely
|
|
3
|
+
// stays in the log and is listed for the agent.
|
|
4
|
+
import { keepRunLogs } from "./run-logs.js";
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { execFileSync } from 'node:child_process';
|
|
8
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
9
|
+
import { flagValue } from "../cli/output.js";
|
|
10
|
+
import { fail, Failure } from "../failure.js";
|
|
11
|
+
import { readData } from "../data.js";
|
|
12
|
+
import { tempDir } from "../paths.js";
|
|
13
|
+
import { appliedCommand } from "./runs.js";
|
|
14
|
+
import { readActions, updateActions, } from "./actions.js";
|
|
15
|
+
import { switchBack } from "./branch.js";
|
|
16
|
+
import { unlink } from "./libraries.js";
|
|
17
|
+
import { records, stopOne } from "./processes.js";
|
|
18
|
+
const BOM = '\uFEFF';
|
|
19
|
+
const reason = (error) => (error instanceof Error ? error.message : String(error));
|
|
20
|
+
/**
|
|
21
|
+
* A changed JSON file as text, written the way the file was: its indent, line ends and byte order mark. When the
|
|
22
|
+
* result holds what git has, it is git's own text, so the file is clean again.
|
|
23
|
+
*/
|
|
24
|
+
// ponytail: with the user's own uncommitted changes in the file, lists kept on one line are spread out; a text-level
|
|
25
|
+
// edit would keep those
|
|
26
|
+
function jsonTextLike(file, raw, json) {
|
|
27
|
+
try {
|
|
28
|
+
const show = ['-C', path.dirname(file), 'show', `HEAD:./${path.basename(file)}`];
|
|
29
|
+
const committed = execFileSync('git', show, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
|
|
30
|
+
if (isDeepStrictEqual(JSON.parse(committed.replace(BOM, '')), json))
|
|
31
|
+
return committed;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Not in git, or not committed yet.
|
|
35
|
+
}
|
|
36
|
+
const indent = /\n([ \t]+)"/.exec(raw)?.[1] ?? ' ';
|
|
37
|
+
const eol = raw.includes('\r\n') ? '\r\n' : '\n';
|
|
38
|
+
const body = JSON.stringify(json, null, indent).replace(/\n/g, eol);
|
|
39
|
+
return (raw.startsWith(BOM) ? BOM : '') + body + (raw.endsWith('\n') ? eol : '');
|
|
40
|
+
}
|
|
41
|
+
function undoEdit(action) {
|
|
42
|
+
const body = fs.readFileSync(action.file, 'utf8');
|
|
43
|
+
const times = body.split(action.after).length - 1;
|
|
44
|
+
const name = path.basename(action.file);
|
|
45
|
+
if (times === 1) {
|
|
46
|
+
// As a function, so `$&` and the like in the text are put back as they are.
|
|
47
|
+
fs.writeFileSync(action.file, body.replace(action.after, () => action.before));
|
|
48
|
+
return { state: 'gone', said: `reverted ${name}` };
|
|
49
|
+
}
|
|
50
|
+
if (times === 0 && body.includes(action.before))
|
|
51
|
+
return { state: 'gone', said: `${name} already as before` };
|
|
52
|
+
const before = JSON.stringify(action.before).slice(0, 200);
|
|
53
|
+
return { state: 'left', why: `${action.file} changed since Koppler edited it; put back by hand: ${before}` };
|
|
54
|
+
}
|
|
55
|
+
function undoEnvFile(action) {
|
|
56
|
+
const name = path.basename(action.file);
|
|
57
|
+
// A file Koppler made and that is gone already has nothing left to take out.
|
|
58
|
+
if (action.created && !fs.existsSync(action.file))
|
|
59
|
+
return { state: 'gone', said: `${name} already gone` };
|
|
60
|
+
// One line out per line added, the last one: a line of the user's own that reads the same stays.
|
|
61
|
+
const rest = fs.readFileSync(action.file, 'utf8').split('\n');
|
|
62
|
+
const bare = (line) => line.replace(/\r$/, '');
|
|
63
|
+
const added = [action.lines ?? []].flat().flatMap(text => text.split(/\r?\n/).filter(Boolean));
|
|
64
|
+
const missing = [];
|
|
65
|
+
for (const line of added) {
|
|
66
|
+
const at = rest.findLastIndex(one => bare(one) === line);
|
|
67
|
+
if (at >= 0)
|
|
68
|
+
rest.splice(at, 1);
|
|
69
|
+
else
|
|
70
|
+
missing.push(line);
|
|
71
|
+
}
|
|
72
|
+
if (action.created && !rest.join('').trim())
|
|
73
|
+
fs.rmSync(action.file);
|
|
74
|
+
else
|
|
75
|
+
fs.writeFileSync(action.file, rest.join('\n'));
|
|
76
|
+
if (missing.length)
|
|
77
|
+
return {
|
|
78
|
+
state: 'left',
|
|
79
|
+
why: `${action.file} no longer has what Koppler added; take out by hand: ${missing.join(', ').slice(0, 200)}`,
|
|
80
|
+
};
|
|
81
|
+
return { state: 'gone', said: `removed Koppler's lines from ${name}` };
|
|
82
|
+
}
|
|
83
|
+
function undoProfile(action) {
|
|
84
|
+
const raw = fs.readFileSync(action.file, 'utf8');
|
|
85
|
+
const settings = JSON.parse(raw.replace(BOM, ''));
|
|
86
|
+
const profile = settings.profiles?.[action.name];
|
|
87
|
+
if (action.created)
|
|
88
|
+
delete settings.profiles?.[action.name];
|
|
89
|
+
else if (profile && action.previous)
|
|
90
|
+
profile.environmentVariables = action.previous;
|
|
91
|
+
fs.writeFileSync(action.file, jsonTextLike(action.file, raw, settings));
|
|
92
|
+
return { state: 'gone', said: `${action.created ? 'removed' : 'restored'} launch profile ${action.name}` };
|
|
93
|
+
}
|
|
94
|
+
/** Undoes one logged change, or says why it could not or that it comes later. */
|
|
95
|
+
function undo(action) {
|
|
96
|
+
switch (action.kind) {
|
|
97
|
+
case 'edit':
|
|
98
|
+
return undoEdit(action);
|
|
99
|
+
case 'env-file':
|
|
100
|
+
return undoEnvFile(action);
|
|
101
|
+
case 'profile':
|
|
102
|
+
return undoProfile(action);
|
|
103
|
+
case 'file':
|
|
104
|
+
try {
|
|
105
|
+
return { state: 'gone', said: unlink(action) };
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return { state: 'left', why: reason(error) };
|
|
109
|
+
}
|
|
110
|
+
// Branches go back last, once the edits on them are undone; packages are installed again after that, from the
|
|
111
|
+
// lockfile that belongs to the branch.
|
|
112
|
+
case 'checkout':
|
|
113
|
+
case 'npm-local':
|
|
114
|
+
return { state: 'later' };
|
|
115
|
+
case 'process':
|
|
116
|
+
if (!action.pid)
|
|
117
|
+
return { state: 'gone' };
|
|
118
|
+
try {
|
|
119
|
+
process.kill(action.pid, 0);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return { state: 'gone' };
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
state: 'left',
|
|
126
|
+
why: `still running as pid ${String(action.pid)}; not started through koppler, so check it before stopping`,
|
|
127
|
+
};
|
|
128
|
+
case 'secret':
|
|
129
|
+
return { state: 'gone' };
|
|
130
|
+
default:
|
|
131
|
+
return { state: 'left', why: `unknown change "${String(action.kind)}" in the log` };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const same = (a) => (b) => JSON.stringify(a) === JSON.stringify(b);
|
|
135
|
+
/** Temporary edits nobody logged still carry their marker; one line per clone that has some. */
|
|
136
|
+
function unloggedEdits() {
|
|
137
|
+
const clones = (readData('local')?.['apps'] ?? {});
|
|
138
|
+
// Written in two parts, so this file does not carry the marker itself.
|
|
139
|
+
const marker = ['koppler:.*do not', 'commit'].join(' ');
|
|
140
|
+
return Object.entries(clones).flatMap(([id, clone]) => {
|
|
141
|
+
if (!clone?.path)
|
|
142
|
+
return [];
|
|
143
|
+
try {
|
|
144
|
+
const found = execFileSync('git', ['-C', clone.path, 'grep', '-nE', marker], {
|
|
145
|
+
encoding: 'utf8',
|
|
146
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
147
|
+
});
|
|
148
|
+
const hits = found.trim().split('\n').filter(Boolean).slice(0, 10);
|
|
149
|
+
return hits.length > 0 ? [`${id}: unlogged temporary edits:\n ${hits.join('\n ')}`] : [];
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// git grep exits 1 when it finds nothing.
|
|
153
|
+
return [];
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* `koppler down [--run <id>]`. Exits 3 when something is left for the agent; otherwise, with --run, the Stop is marked
|
|
159
|
+
* done in the history.
|
|
160
|
+
*/
|
|
161
|
+
export async function down(args) {
|
|
162
|
+
const logFile = path.join(tempDir(), 'actions.json');
|
|
163
|
+
for (const record of records().filter(r => r.name !== 'canvas'))
|
|
164
|
+
console.log(await stopOne(record));
|
|
165
|
+
keepRunLogs();
|
|
166
|
+
fs.rmSync(path.join(tempDir(), 'progress.json'), { force: true });
|
|
167
|
+
let log;
|
|
168
|
+
try {
|
|
169
|
+
log = readActions(logFile);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
fail(reason(error));
|
|
173
|
+
}
|
|
174
|
+
const apps = (readData('registry')?.['apps'] ?? {});
|
|
175
|
+
const name = (action) => {
|
|
176
|
+
const fallback = action.kind === 'process' ? (action.label ?? action.command) : 'repo' in action ? action.repo : undefined;
|
|
177
|
+
return (action.app ? (apps[action.app]?.name ?? action.app) : fallback) ?? '';
|
|
178
|
+
};
|
|
179
|
+
// A file logged without its folder is looked for where it can be: in the app's clone first, since another app's
|
|
180
|
+
// folder may hold a file of the same name, then under each folder the clones are scanned in, then from here.
|
|
181
|
+
const local = readData('local');
|
|
182
|
+
const roots = (local?.['roots'] ?? []);
|
|
183
|
+
const cloneOf = (app) => (app && local?.['apps']?.[app]?.path) || '';
|
|
184
|
+
const located = (action) => {
|
|
185
|
+
if (!('file' in action) || !action.file || path.isAbsolute(action.file))
|
|
186
|
+
return action;
|
|
187
|
+
const bases = [cloneOf(action.app), ...roots, ''].filter((base, at, all) => base || at === all.length - 1);
|
|
188
|
+
const from = bases.map(base => path.resolve(base, action.file));
|
|
189
|
+
return { ...action, file: from.find(file => fs.existsSync(file)) ?? action.file };
|
|
190
|
+
};
|
|
191
|
+
const left = [];
|
|
192
|
+
const keep = [];
|
|
193
|
+
for (const action of log.toReversed()) {
|
|
194
|
+
let result;
|
|
195
|
+
try {
|
|
196
|
+
result = undo(located(action));
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
result = { state: 'left', why: `could not undo ${action.kind} (${reason(error)})` };
|
|
200
|
+
}
|
|
201
|
+
if (result.state === 'gone' && result.said)
|
|
202
|
+
console.log(`${name(action)}: ${result.said}`);
|
|
203
|
+
if (result.state === 'left')
|
|
204
|
+
left.push(`${name(action)}: ${result.why}`);
|
|
205
|
+
if (result.state !== 'gone')
|
|
206
|
+
keep.push(action);
|
|
207
|
+
}
|
|
208
|
+
// What could not be undone stays; entries added meanwhile (another command, the agent) are kept too.
|
|
209
|
+
const handled = new Set(log.map(action => JSON.stringify(action)));
|
|
210
|
+
const kept = keep.toReversed();
|
|
211
|
+
updateActions(logFile, list => {
|
|
212
|
+
const added = list.filter(action => !handled.has(JSON.stringify(action)));
|
|
213
|
+
list.splice(0, list.length, ...kept, ...added);
|
|
214
|
+
});
|
|
215
|
+
// switchBack takes each branch switch off the log as it succeeds.
|
|
216
|
+
const stuck = new Set();
|
|
217
|
+
for (const action of keep.filter((a) => a.kind === 'checkout')) {
|
|
218
|
+
const outcome = switchBack({ app: action.app, logFile });
|
|
219
|
+
if (outcome.error === undefined)
|
|
220
|
+
console.log(outcome.message);
|
|
221
|
+
else {
|
|
222
|
+
left.push(outcome.error);
|
|
223
|
+
stuck.add(action.app);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
for (const action of keep.filter((a) => a.kind === 'npm-local')) {
|
|
227
|
+
if (action.app && stuck.has(action.app)) {
|
|
228
|
+
left.push(`${name(action)}: run npm install once its branch is back, to get the published ${action.packages.join(', ')} again`);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
console.log(`${name(action)}: ${unlink(action)}`);
|
|
233
|
+
updateActions(logFile, list => {
|
|
234
|
+
const at = list.findIndex(same(action));
|
|
235
|
+
if (at >= 0)
|
|
236
|
+
list.splice(at, 1);
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
left.push(`${name(action)}: ${reason(error)}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
left.push(...unloggedEdits());
|
|
244
|
+
if (left.length > 0) {
|
|
245
|
+
console.log(`\nLeft for the agent:\n${left.map(line => ` - ${line}`).join('\n')}`);
|
|
246
|
+
throw new Failure('', 3);
|
|
247
|
+
}
|
|
248
|
+
console.log('Stopped and reverted.');
|
|
249
|
+
const run = flagValue(args, '--run');
|
|
250
|
+
if (run)
|
|
251
|
+
await appliedCommand([run]);
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=down.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/engine/down.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// Run history: every Send and Stop from the canvas is kept as a record (what was asked, the plan the user confirmed, how
|
|
2
|
+
// it ended), and the board last applied is kept as the live state the next plan is compared with. Names only, never secrets.
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import * as kp from "../core/plan.js";
|
|
6
|
+
import { APP_ID, RUN_ID } from "../ids.js";
|
|
7
|
+
import { readStack } from "../data.js";
|
|
8
|
+
import { tempDir } from "../paths.js";
|
|
9
|
+
const historyFile = () => path.join(tempDir(), 'history.jsonl');
|
|
10
|
+
export const liveFile = () => path.join(tempDir(), 'live.json');
|
|
11
|
+
export const actionsFile = () => path.join(tempDir(), 'actions.json');
|
|
12
|
+
const ID = APP_ID;
|
|
13
|
+
const MAX_RUNS = 200;
|
|
14
|
+
const LIBRARY = /^[\w@./-]{1,100}$/;
|
|
15
|
+
const text = (value, max = 200) => (typeof value === 'string' ? value.slice(0, max) : '');
|
|
16
|
+
const isId = (value, pattern = ID) => typeof value === 'string' && pattern.test(value);
|
|
17
|
+
const listOf = (value) => (Array.isArray(value) ? value : []);
|
|
18
|
+
const steps = (list) => listOf(list)
|
|
19
|
+
.map(step => (step ?? {}))
|
|
20
|
+
.filter(step => isId(step['id']))
|
|
21
|
+
.slice(0, 100)
|
|
22
|
+
.map(step => ({
|
|
23
|
+
id: step['id'],
|
|
24
|
+
why: listOf(step['why'])
|
|
25
|
+
.slice(0, 10)
|
|
26
|
+
.map(why => text(why, 200)),
|
|
27
|
+
}));
|
|
28
|
+
export const append = (line) => {
|
|
29
|
+
fs.appendFileSync(historyFile(), JSON.stringify(line) + '\n', { mode: 0o600 });
|
|
30
|
+
};
|
|
31
|
+
const stamp = () => new Date().toISOString();
|
|
32
|
+
/** What is kept of a prompt from the canvas: only known fields, so the file cannot be used to store anything else. */
|
|
33
|
+
export function runRecord(prompt) {
|
|
34
|
+
const data = prompt?.data ?? {};
|
|
35
|
+
const id = data['id'];
|
|
36
|
+
if (!isId(id, RUN_ID))
|
|
37
|
+
return null;
|
|
38
|
+
const stop = prompt?.tag === 'koppler-stop';
|
|
39
|
+
const board = kp.board(stop ? {} : data);
|
|
40
|
+
// An app with nothing to run here (`outside` in the stack: a SaaS, a library, a config repo) is never part of a run.
|
|
41
|
+
const stack = readStack();
|
|
42
|
+
const kept = Object.entries(board.nodes).filter(([app]) => ID.test(app) && !stack?.apps[app]?.outside);
|
|
43
|
+
const nodes = Object.fromEntries(kept.map(([app, node]) => [
|
|
44
|
+
app,
|
|
45
|
+
{
|
|
46
|
+
branch: text(node.branch),
|
|
47
|
+
run: text(node.run, 16),
|
|
48
|
+
...(node.platform && { platform: text(node.platform, 16) }),
|
|
49
|
+
...(node.note && { note: text(node.note, 4000) }),
|
|
50
|
+
...(node.tunnels === false && { tunnels: false }),
|
|
51
|
+
...(node.queues === true && { queues: true }),
|
|
52
|
+
...(node.watch === true && { watch: true }),
|
|
53
|
+
...(node.restart && { restart: true }),
|
|
54
|
+
...(['set-aside', 'take-along'].includes(node.changes ?? '') && { changes: node.changes }),
|
|
55
|
+
...(node.libraries?.length && {
|
|
56
|
+
libraries: node.libraries.filter(library => LIBRARY.test(library)).slice(0, 20),
|
|
57
|
+
}),
|
|
58
|
+
},
|
|
59
|
+
]));
|
|
60
|
+
// Queues the board switched to a local copy; the rest stay the deployed ones.
|
|
61
|
+
const local = Object.entries((data['queues'] ?? {})).filter(([queue, where]) => ID.test(queue) && where === 'local');
|
|
62
|
+
const queues = Object.fromEntries(local.slice(0, 50));
|
|
63
|
+
const plan = (data['plan'] ?? {});
|
|
64
|
+
return {
|
|
65
|
+
id,
|
|
66
|
+
at: prompt?.at ?? stamp(),
|
|
67
|
+
kind: stop ? 'stop' : 'run',
|
|
68
|
+
env: stop ? null : text(data['env'], 16),
|
|
69
|
+
mode: stop ? null : text(data['mode'], 16),
|
|
70
|
+
...(!!data['note'] && { note: text(data['note'], 4000) }),
|
|
71
|
+
nodes,
|
|
72
|
+
edges: board.edges.filter(edge => nodes[edge.from] && nodes[edge.to]),
|
|
73
|
+
...(Object.keys(queues).length && { queues }),
|
|
74
|
+
plan: {
|
|
75
|
+
starts: steps(plan['starts']),
|
|
76
|
+
restarts: steps(plan['restarts']),
|
|
77
|
+
stops: steps(plan['stops']),
|
|
78
|
+
keeps: steps(plan['keeps']),
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const NOTES = ['stop-apps', 'stop-all', 'canvas-closed'];
|
|
83
|
+
export const appendNote = (note, stopped = []) => {
|
|
84
|
+
fs.mkdirSync(tempDir(), { recursive: true });
|
|
85
|
+
append({ note, at: stamp(), stopped: stopped.filter(name => ID.test(name)).slice(0, 100) });
|
|
86
|
+
};
|
|
87
|
+
/** The notes in the history, oldest first. They are not runs: no plan or live state looks at them. */
|
|
88
|
+
export function readNotes(raw) {
|
|
89
|
+
return (raw ?? '').split('\n').flatMap(line => {
|
|
90
|
+
try {
|
|
91
|
+
const { note, at, stopped } = JSON.parse(line);
|
|
92
|
+
if (!NOTES.includes(note ?? '') || typeof at !== 'string')
|
|
93
|
+
return [];
|
|
94
|
+
const names = (Array.isArray(stopped) ? stopped : []).filter(name => typeof name === 'string' && ID.test(name));
|
|
95
|
+
return [{ note, at: at.slice(0, 40), stopped: names.slice(0, 100) }];
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
export const notes = () => {
|
|
103
|
+
try {
|
|
104
|
+
return readNotes(fs.readFileSync(historyFile(), 'utf8')).slice(-MAX_RUNS);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
export const NOTE_WORDS = {
|
|
111
|
+
'stop-apps': 'apps stopped, changes kept',
|
|
112
|
+
'stop-all': 'everything stopped, changes kept',
|
|
113
|
+
'canvas-closed': 'canvas closed',
|
|
114
|
+
};
|
|
115
|
+
export const appendRun = (record) => {
|
|
116
|
+
append(record);
|
|
117
|
+
};
|
|
118
|
+
export const appendEvent = (id, event, reason) => {
|
|
119
|
+
append({ id, event, at: stamp(), ...(reason && { reason: text(reason, 500) }) });
|
|
120
|
+
};
|
|
121
|
+
const CODE_KINDS = ['edit', 'profile', 'env-file', 'checkout'];
|
|
122
|
+
/**
|
|
123
|
+
* The code changes in the action log, as removed and added lines per app and file, for the History's diffs.
|
|
124
|
+
* Kept with the run, so a past run still shows them after a revert. Bounded, and passed through `clean` (secret redaction).
|
|
125
|
+
*/
|
|
126
|
+
export function codeChanges(actions, { clean = line => line, profileEnv = () => null, } = {}) {
|
|
127
|
+
const cleaned = (line) => clean(String(line)).slice(0, 300);
|
|
128
|
+
const lines = (value) => (typeof value === 'string' ? value : '').split('\n').slice(0, 60).map(cleaned);
|
|
129
|
+
const settings = (value) => value && typeof value === 'object'
|
|
130
|
+
? Object.entries(value)
|
|
131
|
+
.slice(0, 60)
|
|
132
|
+
.map(([name, set]) => cleaned(`${name}=${String(set)}`))
|
|
133
|
+
: [];
|
|
134
|
+
return listOf(actions)
|
|
135
|
+
.map(action => (action ?? {}))
|
|
136
|
+
.filter(action => CODE_KINDS.includes(action['kind']))
|
|
137
|
+
.slice(0, 40)
|
|
138
|
+
.map(action => {
|
|
139
|
+
const kind = action['kind'];
|
|
140
|
+
const base = { app: text(action['app'] ?? action['repo'], 64), kind, file: text(action['file'], 300) };
|
|
141
|
+
if (kind === 'edit')
|
|
142
|
+
return { ...base, title: 'Temporary edit', removed: lines(action['before']), added: lines(action['after']) };
|
|
143
|
+
if (kind === 'env-file') {
|
|
144
|
+
const added = Array.isArray(action['lines']) ? action['lines'] : lines(action['lines']);
|
|
145
|
+
const title = action['created'] ? 'New file' : 'Lines added';
|
|
146
|
+
return { ...base, title, removed: [], added: added.slice(0, 60).map(cleaned) };
|
|
147
|
+
}
|
|
148
|
+
if (kind === 'checkout')
|
|
149
|
+
return { ...base, title: 'Branch switched', removed: [text(action['from'])], added: [text(action['to'])] };
|
|
150
|
+
const title = `${action['created'] ? 'New' : 'Changed'} launch profile ${text(action['name'], 80)}`;
|
|
151
|
+
return { ...base, title, removed: settings(action['previous']), added: settings(profileEnv(action)) };
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Runs oldest first, each with its state: waiting (nobody picked it up), applying, done, failed, or replaced by a
|
|
156
|
+
* newer Send before it was picked up.
|
|
157
|
+
*/
|
|
158
|
+
export function readRuns(raw) {
|
|
159
|
+
const runs = new Map();
|
|
160
|
+
for (const line of (raw ?? '').split('\n')) {
|
|
161
|
+
let entry;
|
|
162
|
+
try {
|
|
163
|
+
entry = JSON.parse(line);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const id = entry?.['id'];
|
|
169
|
+
if (!entry || !isId(id, RUN_ID))
|
|
170
|
+
continue;
|
|
171
|
+
if (entry['event']) {
|
|
172
|
+
const run = runs.get(id);
|
|
173
|
+
if (!run)
|
|
174
|
+
continue;
|
|
175
|
+
if (entry['event'] === 'picked')
|
|
176
|
+
run.state = run.state === 'waiting' ? 'applying' : run.state;
|
|
177
|
+
else
|
|
178
|
+
Object.assign(run, {
|
|
179
|
+
state: entry['event'] === 'failed' ? 'failed' : 'done',
|
|
180
|
+
endedAt: entry['at'],
|
|
181
|
+
...(Array.isArray(entry['changes']) && { changes: entry['changes'] }),
|
|
182
|
+
...(!!entry['reason'] && { reason: entry['reason'] }),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
else if (entry['nodes'])
|
|
186
|
+
runs.set(id, { ...entry, state: 'waiting' });
|
|
187
|
+
}
|
|
188
|
+
const list = [...runs.values()];
|
|
189
|
+
// A waiting Send is replaced by any newer one; one being applied only by a newer one the agent picked up.
|
|
190
|
+
list.forEach((run, at) => {
|
|
191
|
+
const later = list.slice(at + 1);
|
|
192
|
+
const newer = later.some(next => next.kind);
|
|
193
|
+
const pickedUp = later.some(next => next.kind && next.state !== 'waiting' && next.state !== 'replaced');
|
|
194
|
+
if ((run.state === 'waiting' && newer) || (run.state === 'applying' && pickedUp))
|
|
195
|
+
run.state = 'replaced';
|
|
196
|
+
});
|
|
197
|
+
return list.slice(-MAX_RUNS);
|
|
198
|
+
}
|
|
199
|
+
export const runs = () => {
|
|
200
|
+
try {
|
|
201
|
+
return readRuns(fs.readFileSync(historyFile(), 'utf8'));
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
export const live = () => {
|
|
208
|
+
try {
|
|
209
|
+
return JSON.parse(fs.readFileSync(liveFile(), 'utf8'));
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/engine/history.ts"],"names":[],"mappings":"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"}
|