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.
Files changed (225) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -2
  3. package/bin/run-logged +16 -0
  4. package/bin/secret-list +7 -0
  5. package/bin/secret-psql +41 -0
  6. package/bin/secret-set +17 -0
  7. package/bin/secret-store +82 -0
  8. package/bin/secret-test +10 -0
  9. package/bin/with-secrets +25 -0
  10. package/dist/.built +1 -0
  11. package/dist/cli/agent.js +144 -0
  12. package/dist/cli/agent.js.map +1 -0
  13. package/dist/cli/doctor.js +173 -0
  14. package/dist/cli/doctor.js.map +1 -0
  15. package/dist/cli/mcp.js +204 -0
  16. package/dist/cli/mcp.js.map +1 -0
  17. package/dist/cli/output.js +37 -0
  18. package/dist/cli/output.js.map +1 -0
  19. package/dist/cli/records.js +121 -0
  20. package/dist/cli/records.js.map +1 -0
  21. package/dist/cli/running.js +270 -0
  22. package/dist/cli/running.js.map +1 -0
  23. package/dist/cli/shell.js +43 -0
  24. package/dist/cli/shell.js.map +1 -0
  25. package/dist/cli/wait.js +59 -0
  26. package/dist/cli/wait.js.map +1 -0
  27. package/dist/core/addresses.js +55 -0
  28. package/dist/core/addresses.js.map +1 -0
  29. package/dist/core/arrange.js +329 -0
  30. package/dist/core/arrange.js.map +1 -0
  31. package/dist/core/cables.js +158 -0
  32. package/dist/core/cables.js.map +1 -0
  33. package/dist/core/expressions.js +72 -0
  34. package/dist/core/expressions.js.map +1 -0
  35. package/dist/core/frameworks.js +13 -0
  36. package/dist/core/frameworks.js.map +1 -0
  37. package/dist/core/kinds.js +244 -0
  38. package/dist/core/kinds.js.map +1 -0
  39. package/dist/core/launch.js +181 -0
  40. package/dist/core/launch.js.map +1 -0
  41. package/dist/core/logfmt.js +144 -0
  42. package/dist/core/logfmt.js.map +1 -0
  43. package/dist/core/mock.js +27 -0
  44. package/dist/core/mock.js.map +1 -0
  45. package/dist/core/plan.js +147 -0
  46. package/dist/core/plan.js.map +1 -0
  47. package/dist/core/ports.js +155 -0
  48. package/dist/core/ports.js.map +1 -0
  49. package/dist/core/presets.js +186 -0
  50. package/dist/core/presets.js.map +1 -0
  51. package/dist/core/secret-types.js +3 -0
  52. package/dist/core/secret-types.js.map +1 -0
  53. package/dist/core/sign-in.js +30 -0
  54. package/dist/core/sign-in.js.map +1 -0
  55. package/dist/core/stack-path.js +64 -0
  56. package/dist/core/stack-path.js.map +1 -0
  57. package/dist/core/stack.js +509 -0
  58. package/dist/core/stack.js.map +1 -0
  59. package/dist/core/terraform.js +393 -0
  60. package/dist/core/terraform.js.map +1 -0
  61. package/dist/data.js +37 -0
  62. package/dist/data.js.map +1 -0
  63. package/dist/engine/actions.js +99 -0
  64. package/dist/engine/actions.js.map +1 -0
  65. package/dist/engine/app-commands.js +106 -0
  66. package/dist/engine/app-commands.js.map +1 -0
  67. package/dist/engine/app-start.js +167 -0
  68. package/dist/engine/app-start.js.map +1 -0
  69. package/dist/engine/app-state.js +43 -0
  70. package/dist/engine/app-state.js.map +1 -0
  71. package/dist/engine/boards.js +219 -0
  72. package/dist/engine/boards.js.map +1 -0
  73. package/dist/engine/branch.js +194 -0
  74. package/dist/engine/branch.js.map +1 -0
  75. package/dist/engine/browser-console.js +45 -0
  76. package/dist/engine/browser-console.js.map +1 -0
  77. package/dist/engine/calls.js +97 -0
  78. package/dist/engine/calls.js.map +1 -0
  79. package/dist/engine/checks.js +270 -0
  80. package/dist/engine/checks.js.map +1 -0
  81. package/dist/engine/clones.js +67 -0
  82. package/dist/engine/clones.js.map +1 -0
  83. package/dist/engine/config.js +26 -0
  84. package/dist/engine/config.js.map +1 -0
  85. package/dist/engine/deployed.js +488 -0
  86. package/dist/engine/deployed.js.map +1 -0
  87. package/dist/engine/devices.js +81 -0
  88. package/dist/engine/devices.js.map +1 -0
  89. package/dist/engine/discover.js +236 -0
  90. package/dist/engine/discover.js.map +1 -0
  91. package/dist/engine/down.js +253 -0
  92. package/dist/engine/down.js.map +1 -0
  93. package/dist/engine/history.js +215 -0
  94. package/dist/engine/history.js.map +1 -0
  95. package/dist/engine/investigate.js +278 -0
  96. package/dist/engine/investigate.js.map +1 -0
  97. package/dist/engine/libraries.js +129 -0
  98. package/dist/engine/libraries.js.map +1 -0
  99. package/dist/engine/linked.js +146 -0
  100. package/dist/engine/linked.js.map +1 -0
  101. package/dist/engine/listen.js +223 -0
  102. package/dist/engine/listen.js.map +1 -0
  103. package/dist/engine/locks.js +38 -0
  104. package/dist/engine/locks.js.map +1 -0
  105. package/dist/engine/messages.js +177 -0
  106. package/dist/engine/messages.js.map +1 -0
  107. package/dist/engine/needs.js +363 -0
  108. package/dist/engine/needs.js.map +1 -0
  109. package/dist/engine/processes.js +350 -0
  110. package/dist/engine/processes.js.map +1 -0
  111. package/dist/engine/query.js +241 -0
  112. package/dist/engine/query.js.map +1 -0
  113. package/dist/engine/queues.js +100 -0
  114. package/dist/engine/queues.js.map +1 -0
  115. package/dist/engine/recipes.js +248 -0
  116. package/dist/engine/recipes.js.map +1 -0
  117. package/dist/engine/reload.js +32 -0
  118. package/dist/engine/reload.js.map +1 -0
  119. package/dist/engine/repos.js +214 -0
  120. package/dist/engine/repos.js.map +1 -0
  121. package/dist/engine/research.js +134 -0
  122. package/dist/engine/research.js.map +1 -0
  123. package/dist/engine/run-logs.js +79 -0
  124. package/dist/engine/run-logs.js.map +1 -0
  125. package/dist/engine/run.js +54 -0
  126. package/dist/engine/run.js.map +1 -0
  127. package/dist/engine/runs.js +223 -0
  128. package/dist/engine/runs.js.map +1 -0
  129. package/dist/engine/session.js +130 -0
  130. package/dist/engine/session.js.map +1 -0
  131. package/dist/engine/share.js +124 -0
  132. package/dist/engine/share.js.map +1 -0
  133. package/dist/engine/stack-file.js +206 -0
  134. package/dist/engine/stack-file.js.map +1 -0
  135. package/dist/engine/stack-share.js +86 -0
  136. package/dist/engine/stack-share.js.map +1 -0
  137. package/dist/engine/stacks.js +143 -0
  138. package/dist/engine/stacks.js.map +1 -0
  139. package/dist/engine/sync.js +214 -0
  140. package/dist/engine/sync.js.map +1 -0
  141. package/dist/engine/traces.js +65 -0
  142. package/dist/engine/traces.js.map +1 -0
  143. package/dist/engine/up.js +621 -0
  144. package/dist/engine/up.js.map +1 -0
  145. package/dist/engine/watch.js +71 -0
  146. package/dist/engine/watch.js.map +1 -0
  147. package/dist/engine/wire.js +120 -0
  148. package/dist/engine/wire.js.map +1 -0
  149. package/dist/failure.js +16 -0
  150. package/dist/failure.js.map +1 -0
  151. package/dist/github.js +95 -0
  152. package/dist/github.js.map +1 -0
  153. package/dist/ids.js +6 -0
  154. package/dist/ids.js.map +1 -0
  155. package/dist/json-files.js +36 -0
  156. package/dist/json-files.js.map +1 -0
  157. package/dist/koppler.mjs +840 -0
  158. package/dist/koppler.mjs.map +1 -0
  159. package/dist/lambda-local.mjs +250 -0
  160. package/dist/lambda-local.mjs.map +1 -0
  161. package/dist/lambda-secrets-proxy.go +31 -0
  162. package/dist/mock-server.mjs +23 -0
  163. package/dist/mock-server.mjs.map +1 -0
  164. package/dist/page/assets/JetBrainsMono-cyrillic-D2jMJ_bk.woff2 +0 -0
  165. package/dist/page/assets/JetBrainsMono-greek-D2nYnAec.woff2 +0 -0
  166. package/dist/page/assets/JetBrainsMono-latin-Db4Uuiha.woff2 +0 -0
  167. package/dist/page/assets/JetBrainsMono-latin-ext-Bnd2h4Br.woff2 +0 -0
  168. package/dist/page/assets/JetBrainsMono-vietnamese-CNlsqbWb.woff2 +0 -0
  169. package/dist/page/assets/SchibstedGrotesk-latin-DxefFeRw.woff2 +0 -0
  170. package/dist/page/assets/SchibstedGrotesk-latin-ext-CnpJE18X.woff2 +0 -0
  171. package/dist/page/assets/index-Bkj_pX35.js +42 -0
  172. package/dist/page/assets/index-Dq45jswH.css +1 -0
  173. package/dist/page/index.html +14 -0
  174. package/dist/page/theme.js +8 -0
  175. package/dist/paths.js +19 -0
  176. package/dist/paths.js.map +1 -0
  177. package/dist/safe-env.js +73 -0
  178. package/dist/safe-env.js.map +1 -0
  179. package/dist/sam-local.mjs +135 -0
  180. package/dist/sam-local.mjs.map +1 -0
  181. package/dist/scrub.js +87 -0
  182. package/dist/scrub.js.map +1 -0
  183. package/dist/secret-check.mjs +262 -0
  184. package/dist/secret-check.mjs.map +1 -0
  185. package/dist/server/browser-console.js +117 -0
  186. package/dist/server/browser-console.js.map +1 -0
  187. package/dist/server/cable-test.js +365 -0
  188. package/dist/server/cable-test.js.map +1 -0
  189. package/dist/server/choices.js +51 -0
  190. package/dist/server/choices.js.map +1 -0
  191. package/dist/server/files.js +107 -0
  192. package/dist/server/files.js.map +1 -0
  193. package/dist/server/gate.js +128 -0
  194. package/dist/server/gate.js.map +1 -0
  195. package/dist/server/logs.js +76 -0
  196. package/dist/server/logs.js.map +1 -0
  197. package/dist/server/mobile.js +113 -0
  198. package/dist/server/mobile.js.map +1 -0
  199. package/dist/server/routes.js +326 -0
  200. package/dist/server/routes.js.map +1 -0
  201. package/dist/server/runs.js +111 -0
  202. package/dist/server/runs.js.map +1 -0
  203. package/dist/server/sanitize.js +242 -0
  204. package/dist/server/sanitize.js.map +1 -0
  205. package/dist/server/secrets.js +111 -0
  206. package/dist/server/secrets.js.map +1 -0
  207. package/dist/server/status.js +321 -0
  208. package/dist/server/status.js.map +1 -0
  209. package/dist/server/token.js +38 -0
  210. package/dist/server/token.js.map +1 -0
  211. package/dist/server/waiting.js +79 -0
  212. package/dist/server/waiting.js.map +1 -0
  213. package/dist/status-watch.mjs +63 -0
  214. package/dist/status-watch.mjs.map +1 -0
  215. package/package.json +74 -4
  216. package/skills/koppler-run/SKILL.md +169 -0
  217. package/skills/koppler-run/VERSION +1 -0
  218. package/skills/koppler-run/references/action-log.md +50 -0
  219. package/skills/koppler-run/references/permissions.md +25 -0
  220. package/skills/koppler-run/references/preparing-nodes.md +62 -0
  221. package/skills/koppler-run/references/reporting-bugs.md +76 -0
  222. package/skills/koppler-run/references/research.md +40 -0
  223. package/skills/koppler-run/references/secrets.md +56 -0
  224. package/skills/koppler-run/references/stack.md +197 -0
  225. 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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"}