@knpkv/herdr-approvals 0.2.0

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 (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/dist/activity-history.d.ts +36 -0
  4. package/dist/activity-history.d.ts.map +1 -0
  5. package/dist/activity-history.js +233 -0
  6. package/dist/activity-history.js.map +1 -0
  7. package/dist/approval-app-view.d.ts +26 -0
  8. package/dist/approval-app-view.d.ts.map +1 -0
  9. package/dist/approval-app-view.js +79 -0
  10. package/dist/approval-app-view.js.map +1 -0
  11. package/dist/approval-client.d.ts +2 -0
  12. package/dist/approval-client.d.ts.map +1 -0
  13. package/dist/approval-client.js +520 -0
  14. package/dist/approval-client.js.map +1 -0
  15. package/dist/approval-sw.js +28 -0
  16. package/dist/approval-sw.js.map +7 -0
  17. package/dist/approval-url.d.ts +37 -0
  18. package/dist/approval-url.d.ts.map +1 -0
  19. package/dist/approval-url.js +37 -0
  20. package/dist/approval-url.js.map +1 -0
  21. package/dist/approval.js +188 -0
  22. package/dist/approval.js.map +7 -0
  23. package/dist/auth.d.ts +10 -0
  24. package/dist/auth.d.ts.map +1 -0
  25. package/dist/auth.js +14 -0
  26. package/dist/auth.js.map +1 -0
  27. package/dist/bin.d.ts +3 -0
  28. package/dist/bin.d.ts.map +1 -0
  29. package/dist/bin.js +47 -0
  30. package/dist/bin.js.map +1 -0
  31. package/dist/connect-entry.d.ts +2 -0
  32. package/dist/connect-entry.d.ts.map +1 -0
  33. package/dist/connect-entry.js +2 -0
  34. package/dist/connect-entry.js.map +1 -0
  35. package/dist/connect.js +188 -0
  36. package/dist/connect.js.map +7 -0
  37. package/dist/dashboard-model.d.ts +719 -0
  38. package/dist/dashboard-model.d.ts.map +1 -0
  39. package/dist/dashboard-model.js +83 -0
  40. package/dist/dashboard-model.js.map +1 -0
  41. package/dist/dashboard-view.d.ts +42 -0
  42. package/dist/dashboard-view.d.ts.map +1 -0
  43. package/dist/dashboard-view.js +194 -0
  44. package/dist/dashboard-view.js.map +1 -0
  45. package/dist/errors.d.ts +33 -0
  46. package/dist/errors.d.ts.map +1 -0
  47. package/dist/errors.js +12 -0
  48. package/dist/errors.js.map +1 -0
  49. package/dist/fleetctl-submission.d.ts +68 -0
  50. package/dist/fleetctl-submission.d.ts.map +1 -0
  51. package/dist/fleetctl-submission.js +31 -0
  52. package/dist/fleetctl-submission.js.map +1 -0
  53. package/dist/fleetctl.d.ts +22 -0
  54. package/dist/fleetctl.d.ts.map +1 -0
  55. package/dist/fleetctl.js +264 -0
  56. package/dist/fleetctl.js.map +1 -0
  57. package/dist/geist-latin-wght-normal.woff2 +0 -0
  58. package/dist/geist-mono-latin-wght-normal.woff2 +0 -0
  59. package/dist/http.d.ts +1512 -0
  60. package/dist/http.d.ts.map +1 -0
  61. package/dist/http.js +1653 -0
  62. package/dist/http.js.map +1 -0
  63. package/dist/index.css +2 -0
  64. package/dist/index.css.map +7 -0
  65. package/dist/index.d.ts +12 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +12 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/internal/config-path.d.ts +3 -0
  70. package/dist/internal/config-path.d.ts.map +1 -0
  71. package/dist/internal/config-path.js +3 -0
  72. package/dist/internal/config-path.js.map +1 -0
  73. package/dist/internal/dashboard-pending-state.d.ts +49 -0
  74. package/dist/internal/dashboard-pending-state.d.ts.map +1 -0
  75. package/dist/internal/dashboard-pending-state.js +98 -0
  76. package/dist/internal/dashboard-pending-state.js.map +1 -0
  77. package/dist/internal/fleet-follow.d.ts +54 -0
  78. package/dist/internal/fleet-follow.d.ts.map +1 -0
  79. package/dist/internal/fleet-follow.js +10 -0
  80. package/dist/internal/fleet-follow.js.map +1 -0
  81. package/dist/internal/fleet-request.d.ts +4 -0
  82. package/dist/internal/fleet-request.d.ts.map +1 -0
  83. package/dist/internal/fleet-request.js +11 -0
  84. package/dist/internal/fleet-request.js.map +1 -0
  85. package/dist/internal/html.d.ts +3 -0
  86. package/dist/internal/html.d.ts.map +1 -0
  87. package/dist/internal/html.js +8 -0
  88. package/dist/internal/html.js.map +1 -0
  89. package/dist/internal/websocket.d.ts +4 -0
  90. package/dist/internal/websocket.d.ts.map +1 -0
  91. package/dist/internal/websocket.js +12 -0
  92. package/dist/internal/websocket.js.map +1 -0
  93. package/dist/model.d.ts +40 -0
  94. package/dist/model.d.ts.map +1 -0
  95. package/dist/model.js +53 -0
  96. package/dist/model.js.map +1 -0
  97. package/dist/operations.d.ts +72 -0
  98. package/dist/operations.d.ts.map +1 -0
  99. package/dist/operations.js +284 -0
  100. package/dist/operations.js.map +1 -0
  101. package/dist/push-policy.d.ts +3 -0
  102. package/dist/push-policy.d.ts.map +1 -0
  103. package/dist/push-policy.js +3 -0
  104. package/dist/push-policy.js.map +1 -0
  105. package/dist/push-sender.d.ts +18 -0
  106. package/dist/push-sender.d.ts.map +1 -0
  107. package/dist/push-sender.js +33 -0
  108. package/dist/push-sender.js.map +1 -0
  109. package/dist/push-subscription.d.ts +17 -0
  110. package/dist/push-subscription.d.ts.map +1 -0
  111. package/dist/push-subscription.js +62 -0
  112. package/dist/push-subscription.js.map +1 -0
  113. package/dist/push-worker.d.ts +20 -0
  114. package/dist/push-worker.d.ts.map +1 -0
  115. package/dist/push-worker.js +32 -0
  116. package/dist/push-worker.js.map +1 -0
  117. package/dist/pwa.d.ts +39 -0
  118. package/dist/pwa.d.ts.map +1 -0
  119. package/dist/pwa.js +51 -0
  120. package/dist/pwa.js.map +1 -0
  121. package/dist/shell-view.d.ts +20 -0
  122. package/dist/shell-view.d.ts.map +1 -0
  123. package/dist/shell-view.js +86 -0
  124. package/dist/shell-view.js.map +1 -0
  125. package/dist/store.d.ts +46 -0
  126. package/dist/store.d.ts.map +1 -0
  127. package/dist/store.js +291 -0
  128. package/dist/store.js.map +1 -0
  129. package/dist/work-checkpoint.d.ts +107 -0
  130. package/dist/work-checkpoint.d.ts.map +1 -0
  131. package/dist/work-checkpoint.js +37 -0
  132. package/dist/work-checkpoint.js.map +1 -0
  133. package/package.json +90 -0
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env node
2
+ import { NodeHttpClient, NodeRuntime, NodeServices } from "@effect/platform-node";
3
+ import { boundedResponseText, FleetOperationError, FleetValidationError, HostStatus, JobHistoryPage, JobPayload, JobRecord, loadConfiguration } from "@knpkv/herdr-fleet";
4
+ import { make as makeTailscale, nodeIpv4, resolveFleetNode } from "@knpkv/herdr-tailscale";
5
+ import { WorkGoalCheckpoint, WorkSnapshots } from "@knpkv/herdr-work/model";
6
+ import { Console, Effect, Layer, Schema, Stdio } from "effect";
7
+ import * as HttpClient from "effect/unstable/http/HttpClient";
8
+ import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
9
+ import { resolveApprovalPage } from "./approval-url.js";
10
+ import { submitToHost } from "./fleetctl-submission.js";
11
+ import { fleetConfigPath } from "./internal/config-path.js";
12
+ import { followJob } from "./internal/fleet-follow.js";
13
+ import { withFleetRequestTimeout } from "./internal/fleet-request.js";
14
+ import { workCheckpointFromJson, workCheckpointUrl, workSnapshotUrl } from "./work-checkpoint.js";
15
+ const operationError = (operation) => (cause) => new FleetOperationError({ cause, detail: String(cause), operation });
16
+ const endpoint = Effect.fn("Fleetctl.endpoint")(function* (config, tailscale, target) {
17
+ const known = config.machines.find(({ host }) => host.toLowerCase() === target.toLowerCase());
18
+ if (known === undefined)
19
+ return yield* new FleetValidationError({ detail: `unknown host: ${target}` });
20
+ if (known.host.toLowerCase() === config.host.toLowerCase())
21
+ return `http://127.0.0.1:${config.localPort}`;
22
+ if (!config.crossHost) {
23
+ return yield* new FleetValidationError({
24
+ detail: "cross-host fleet control is disabled on this machine"
25
+ });
26
+ }
27
+ const status = yield* tailscale.status.pipe(Effect.mapError(operationError("tailscale.status")));
28
+ const node = yield* resolveFleetNode(status, known).pipe(Effect.mapError(operationError("fleet.resolve_host.identity")));
29
+ const address = nodeIpv4(node);
30
+ if (address === undefined || !node.Online) {
31
+ return yield* new FleetOperationError({
32
+ cause: known.host,
33
+ detail: `${known.host} is not online in Tailscale status`,
34
+ operation: "fleet.resolve_host"
35
+ });
36
+ }
37
+ return `http://${address}:${config.port}`;
38
+ });
39
+ const requestAt = Effect.fn("Fleetctl.requestAt")(function* (url, schema, body) {
40
+ const client = yield* HttpClient.HttpClient;
41
+ const httpRequest = body === undefined
42
+ ? HttpClientRequest.get(url)
43
+ : yield* HttpClientRequest.post(url).pipe(HttpClientRequest.bodyJson(body), Effect.mapError(operationError("fleet.request.encode")));
44
+ return yield* withFleetRequestTimeout(Effect.gen(function* () {
45
+ const response = yield* client.execute(httpRequest).pipe(Effect.mapError(operationError("fleet.request")));
46
+ const text = yield* boundedResponseText(response).pipe(Effect.mapError(operationError("fleet.response")));
47
+ if (response.status < 200 || response.status >= 300) {
48
+ return yield* new FleetOperationError({
49
+ cause: text,
50
+ detail: `HTTP ${response.status}: ${text.trim()}`,
51
+ operation: "fleet.response"
52
+ });
53
+ }
54
+ return yield* Schema.decodeUnknownEffect(Schema.fromJsonString(schema))(text).pipe(Effect.mapError(operationError("fleet.response.decode")));
55
+ }));
56
+ });
57
+ const request = Effect.fn("Fleetctl.request")(function* (config, tailscale, target, path, schema, body) {
58
+ const base = yield* endpoint(config, tailscale, target);
59
+ return yield* requestAt(`${base}${path}`, schema, body);
60
+ });
61
+ const getJob = (config, tailscale, host, id) => request(config, tailscale, host, `/v1/jobs/${encodeURIComponent(id)}`, JobRecord);
62
+ const history = Effect.fn("Fleetctl.history")(function* (config, tailscale, host, rawLimit) {
63
+ const limit = Number(rawLimit);
64
+ if (!Number.isInteger(limit) || limit < 1 || limit > 500) {
65
+ return yield* new FleetValidationError({
66
+ detail: "history limit must be an integer between 1 and 500"
67
+ });
68
+ }
69
+ const records = [];
70
+ let cursor = null;
71
+ do {
72
+ const parameters = new URLSearchParams({
73
+ limit: String(limit - records.length)
74
+ });
75
+ if (cursor !== null) {
76
+ parameters.set("cursorCreatedAt", String(cursor.createdAt));
77
+ parameters.set("cursorId", cursor.id);
78
+ }
79
+ const page = yield* request(config, tailscale, host, `/v1/history?${parameters.toString()}`, JobHistoryPage);
80
+ for (const record of page.records)
81
+ records.push(record);
82
+ cursor = page.nextCursor;
83
+ } while (cursor !== null && records.length < limit);
84
+ return records;
85
+ });
86
+ const submit = (config, tailscale, host, payload) => request(config, tailscale, host, "/v1/jobs", JobRecord, { payload });
87
+ const recordWorkCheckpoint = (config, host, checkpoint) => Effect.flatMap(workCheckpointUrl(config, host), (url) => requestAt(url, WorkGoalCheckpoint, checkpoint));
88
+ const snapshotWork = (config, host) => Effect.flatMap(workSnapshotUrl(config, host), (url) => requestAt(url, WorkSnapshots));
89
+ export const payloadFrom = Effect.fn("Fleetctl.payloadFrom")(function* (args) {
90
+ const kind = args[0];
91
+ switch (kind) {
92
+ case "nix.check": {
93
+ if (args.length !== 1)
94
+ return yield* new FleetValidationError({ detail: "nix.check takes no arguments" });
95
+ return { kind };
96
+ }
97
+ case "nix.apply": {
98
+ const ref = args[1];
99
+ if (args.length !== 2 || ref === undefined) {
100
+ return yield* new FleetValidationError({ detail: "nix.apply requires one ref" });
101
+ }
102
+ return yield* Schema.decodeUnknownEffect(JobPayload)({ kind, ref }).pipe(Effect.mapError((cause) => new FleetValidationError({
103
+ detail: `invalid job: ${String(cause)}`
104
+ })));
105
+ }
106
+ case "agent.delegate": {
107
+ const mode = args[1];
108
+ const repository = args[2];
109
+ if (args.length < 4 || mode === undefined || repository === undefined) {
110
+ return yield* new FleetValidationError({
111
+ detail: "agent.delegate requires mode, repository, and prompt"
112
+ });
113
+ }
114
+ return yield* Schema.decodeUnknownEffect(JobPayload)({
115
+ kind,
116
+ mode,
117
+ prompt: args.slice(3).join(" "),
118
+ repository
119
+ }).pipe(Effect.mapError((cause) => new FleetValidationError({ detail: `invalid job: ${String(cause)}` })));
120
+ }
121
+ case "agent.message": {
122
+ const session = args[1];
123
+ if (args.length < 3 || session === undefined) {
124
+ return yield* new FleetValidationError({ detail: "agent.message requires session and message" });
125
+ }
126
+ return yield* Schema.decodeUnknownEffect(JobPayload)({
127
+ kind,
128
+ message: args.slice(2).join(" "),
129
+ session
130
+ }).pipe(Effect.mapError((cause) => new FleetValidationError({
131
+ detail: `invalid job: ${String(cause)}`
132
+ })));
133
+ }
134
+ default:
135
+ return yield* new FleetValidationError({ detail: `unknown job kind: ${kind ?? ""}` });
136
+ }
137
+ });
138
+ const follow = (config, tailscale, host, id) => followJob(getJob(config, tailscale, host, id));
139
+ const usage = `fleetctl commands:
140
+ hosts
141
+ status HOST
142
+ history HOST [LIMIT]
143
+ job HOST ID
144
+ follow HOST ID
145
+ submit HOST nix.check
146
+ submit HOST nix.apply REF
147
+ submit HOST agent.delegate MODE REPOSITORY PROMPT...
148
+ submit HOST agent.message SESSION MESSAGE...
149
+ work record HOST CHECKPOINT_JSON
150
+ work snapshot [HOST]
151
+ apply-everywhere REF`;
152
+ const main = Effect.gen(function* () {
153
+ const stdio = yield* Stdio.Stdio;
154
+ const args = yield* stdio.args;
155
+ const configPath = yield* fleetConfigPath;
156
+ const config = yield* loadConfiguration(configPath);
157
+ const tailscale = yield* makeTailscale(config.tailscaleCommand);
158
+ const [command, ...rest] = args;
159
+ switch (command) {
160
+ case "hosts": {
161
+ if (!config.crossHost) {
162
+ yield* Console.log(JSON.stringify([{ dnsName: null, host: config.host, online: true }], null, 2));
163
+ return;
164
+ }
165
+ const status = yield* tailscale.status.pipe(Effect.mapError(operationError("tailscale.status")));
166
+ const nodes = yield* Effect.forEach(config.machines, (machine) => resolveFleetNode(status, machine).pipe(Effect.mapError(operationError("fleet.hosts.identity")), Effect.map((node) => ({ machine, node }))));
167
+ yield* Console.log(JSON.stringify(nodes.map(({ machine, node }) => ({
168
+ dnsName: node.DNSName ?? null,
169
+ host: machine.host,
170
+ online: node.Online
171
+ })), null, 2));
172
+ return;
173
+ }
174
+ case "status":
175
+ case "history":
176
+ case "job": {
177
+ const host = rest[0] ?? config.host;
178
+ const value = command === "status"
179
+ ? yield* request(config, tailscale, host, "/v1/status", HostStatus)
180
+ : command === "history"
181
+ ? yield* history(config, tailscale, host, rest[1] ?? "50")
182
+ : yield* request(config, tailscale, host, `/v1/jobs/${encodeURIComponent(rest[1] ?? "")}`, JobRecord);
183
+ yield* Console.log(JSON.stringify(value, null, 2));
184
+ return;
185
+ }
186
+ case "follow": {
187
+ const host = rest[0];
188
+ const id = rest[1];
189
+ if (host === undefined || id === undefined)
190
+ return yield* new FleetValidationError({ detail: usage });
191
+ const record = yield* follow(config, tailscale, host, id);
192
+ yield* Console.log(JSON.stringify(record, null, 2));
193
+ return;
194
+ }
195
+ case "submit": {
196
+ const host = rest[0];
197
+ if (host === undefined)
198
+ return yield* new FleetValidationError({ detail: usage });
199
+ const payload = yield* payloadFrom(rest.slice(1));
200
+ const record = yield* submit(config, tailscale, host, payload);
201
+ if (record.status !== "pending_approval") {
202
+ yield* Console.log(JSON.stringify(record, null, 2));
203
+ return;
204
+ }
205
+ yield* Console.log(JSON.stringify({ id: record.id, status: record.status }, null, 2));
206
+ const approvalUrl = yield* resolveApprovalPage(config, tailscale, host);
207
+ yield* Console.log(JSON.stringify({ ...record, approvalUrl }, null, 2));
208
+ return;
209
+ }
210
+ case "work": {
211
+ const operation = rest[0];
212
+ if (operation === "record") {
213
+ const host = rest[1];
214
+ const json = rest[2];
215
+ if (host === undefined || json === undefined || rest.length !== 3) {
216
+ return yield* new FleetValidationError({ detail: usage });
217
+ }
218
+ const checkpoint = yield* workCheckpointFromJson(json);
219
+ const recorded = yield* recordWorkCheckpoint(config, host, checkpoint);
220
+ yield* Console.log(JSON.stringify(recorded, null, 2));
221
+ return;
222
+ }
223
+ if (operation === "snapshot" && (rest.length === 1 || rest.length === 2)) {
224
+ const snapshot = yield* snapshotWork(config, rest[1] ?? config.host);
225
+ yield* Console.log(JSON.stringify(snapshot, null, 2));
226
+ return;
227
+ }
228
+ return yield* new FleetValidationError({ detail: usage });
229
+ }
230
+ case "apply-everywhere": {
231
+ const ref = rest[0];
232
+ if (ref === undefined)
233
+ return yield* new FleetValidationError({ detail: usage });
234
+ if (!config.crossHost) {
235
+ return yield* new FleetValidationError({ detail: "cross-host fleet control is disabled on this machine" });
236
+ }
237
+ const outcomes = yield* Effect.forEach(config.applyMachines, (host) => submitToHost(host, submit(config, tailscale, host, { kind: "nix.apply", ref }), resolveApprovalPage(config, tailscale, host)), { concurrency: 4 });
238
+ yield* Console.log(JSON.stringify(outcomes.map((outcome) => outcome.record === null
239
+ ? { error: outcome.error, host: outcome.host, status: "failed" }
240
+ : {
241
+ approvalUrl: outcome.approvalUrl,
242
+ approvalUrlError: outcome.approvalUrlError,
243
+ host: outcome.host,
244
+ id: outcome.record.id,
245
+ status: outcome.record.status
246
+ }), null, 2));
247
+ if (outcomes.some((outcome) => outcome.record === null || outcome.approvalUrlError !== null)) {
248
+ return yield* new FleetOperationError({
249
+ cause: outcomes,
250
+ detail: "one or more hosts failed",
251
+ operation: "fleet.apply_everywhere"
252
+ });
253
+ }
254
+ return;
255
+ }
256
+ default:
257
+ return yield* new FleetValidationError({ detail: usage });
258
+ }
259
+ });
260
+ main.pipe(
261
+ // The fleetctl process owns one composed Node runtime layer.
262
+ // @effect-diagnostics-next-line strictEffectProvide:off
263
+ Effect.provide(Layer.merge(NodeServices.layer, NodeHttpClient.layerNodeHttp)), Effect.catch((error) => Console.error(`${error._tag}: ${"detail" in error ? error.detail : String(error)}`).pipe(Effect.andThen(Effect.fail(error)))), NodeRuntime.runMain({ disableErrorReporting: true }));
264
+ //# sourceMappingURL=fleetctl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleetctl.js","sourceRoot":"","sources":["../src/fleetctl.ts"],"names":[],"mappings":"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"}