@usine/server 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +42 -1
  2. package/dist/backend.d.ts +16 -9
  3. package/dist/backend.d.ts.map +1 -1
  4. package/dist/backend.js +13 -2
  5. package/dist/backend.js.map +1 -1
  6. package/dist/backup.d.ts +4 -0
  7. package/dist/backup.d.ts.map +1 -0
  8. package/dist/backup.js +13 -0
  9. package/dist/backup.js.map +1 -0
  10. package/dist/cli.d.ts +36 -7
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +115 -28
  13. package/dist/cli.js.map +1 -1
  14. package/dist/export-run.d.ts +22 -0
  15. package/dist/export-run.d.ts.map +1 -0
  16. package/dist/export-run.js +85 -0
  17. package/dist/export-run.js.map +1 -0
  18. package/dist/http.d.ts.map +1 -1
  19. package/dist/http.js +99 -138
  20. package/dist/http.js.map +1 -1
  21. package/dist/index.d.ts +1 -7
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -7
  24. package/dist/index.js.map +1 -1
  25. package/dist/main.js +18 -8
  26. package/dist/main.js.map +1 -1
  27. package/dist/shutdown.d.ts +7 -0
  28. package/dist/shutdown.d.ts.map +1 -0
  29. package/dist/shutdown.js +49 -0
  30. package/dist/shutdown.js.map +1 -0
  31. package/dist/up.d.ts +2 -2
  32. package/dist/up.d.ts.map +1 -1
  33. package/dist/up.js +48 -25
  34. package/dist/up.js.map +1 -1
  35. package/dist/web/assets/_name-DdyMEUN6.js +6 -0
  36. package/dist/web/assets/_name-eoobiMh0.js +1 -0
  37. package/dist/web/assets/_name-pUxlKZt5.js +1 -0
  38. package/dist/web/assets/badge-t7m0Vk1K.js +146 -0
  39. package/dist/web/assets/bash-CLZ0U2zV.js +1 -0
  40. package/dist/web/assets/button-BoOukj77.js +1 -0
  41. package/dist/web/assets/core-CLXRiB63.js +12 -0
  42. package/dist/web/assets/diff-woXpYk--.js +1 -0
  43. package/dist/web/assets/empty-DbVYU7bi.js +1 -0
  44. package/dist/web/assets/engine-javascript-h-x4hGa4.js +141 -0
  45. package/dist/web/assets/index-CVBBoW6r.css +2 -0
  46. package/dist/web/assets/index-CsW8KcJW.js +10 -0
  47. package/dist/web/assets/json-qhed-kSA.js +1 -0
  48. package/dist/web/assets/loops-DghpuoiG.js +1 -0
  49. package/dist/web/assets/operator-copy-DIsVXn17.js +1 -0
  50. package/dist/web/assets/overview-DmCIVPwN.js +1 -0
  51. package/dist/web/assets/rolldown-runtime-hePW80VL.js +1 -0
  52. package/dist/web/assets/routes-BDyP7vCr.js +1 -0
  53. package/dist/web/assets/run-drawer-B-xhTXe4.js +157 -0
  54. package/dist/web/assets/status-badge-yblcElE0.js +1 -0
  55. package/dist/web/assets/table-B8cLYNvq.js +1 -0
  56. package/dist/web/assets/typescript-bsJCZSQ-.js +1 -0
  57. package/dist/web/assets/useCompositeItem-HmBmWxUW.js +1 -0
  58. package/dist/web/assets/with-selector-N6m4X0X_.js +1 -0
  59. package/dist/web/index.html +9 -2
  60. package/package.json +7 -7
  61. package/dist/web/assets/index-CjRDHHWF.css +0 -2
  62. package/dist/web/assets/index-DmN0SkGf.js +0 -295
@@ -0,0 +1,85 @@
1
+ import { InstanceDirectory } from "@usine/core/instance";
2
+ import { RunId } from "@usine/core/run";
3
+ import { runReaderLayer } from "@usine/engine/local-sqlite";
4
+ import { RunEvidence, RunReader } from "@usine/engine/run-reader";
5
+ import { Console, DateTime, Effect, FileSystem, Match, Option, Path, Schema } from "effect";
6
+ /** JSON encoding preserves timestamps, optional values, and typed Attempt outcomes. */
7
+ export const RunEvidenceFromJson = Schema.fromJsonString(Schema.toCodecJson(Schema.Struct({
8
+ version: Schema.Literal(1),
9
+ exportedAt: Schema.DateTimeUtc,
10
+ ...RunEvidence.fields,
11
+ })), { space: 2 });
12
+ /** Reading, encoding, or writing Run evidence failed; no successful export was reported. */
13
+ export class RunExportError extends Schema.TaggedError("@usine/server/RunExportError")("RunExportError", {
14
+ runId: RunId,
15
+ operation: Schema.Literals(["read", "encode", "write"]),
16
+ path: Schema.String,
17
+ reason: Schema.String,
18
+ cause: Schema.Defect(),
19
+ }) {
20
+ }
21
+ /** Writes a complete evidence file without overwriting an existing destination. */
22
+ const writeRunEvidence = Effect.fn("RunEvidence.write")(function* (evidence, output) {
23
+ const runId = evidence.snapshot.run.id;
24
+ yield* Effect.annotateCurrentSpan({ runId, output });
25
+ const json = yield* Schema.encodeEffect(RunEvidenceFromJson)({
26
+ version: 1,
27
+ exportedAt: yield* DateTime.now,
28
+ ...evidence,
29
+ }).pipe(Effect.mapError((cause) => new RunExportError({ runId, operation: "encode", path: output, reason: cause._tag, cause })));
30
+ const fileSystem = yield* FileSystem.FileSystem;
31
+ const path = yield* Path.Path;
32
+ yield* Effect.scoped(Effect.gen(function* () {
33
+ const temporary = yield* fileSystem.makeTempDirectoryScoped({
34
+ directory: path.dirname(output),
35
+ prefix: ".usine-export-",
36
+ });
37
+ const staged = path.join(temporary, "evidence.json");
38
+ yield* fileSystem.writeFileString(staged, `${json}\n`, { mode: 0o600 });
39
+ // Publish the complete file atomically. A hard link refuses an existing destination.
40
+ yield* fileSystem.link(staged, output);
41
+ })).pipe(Effect.mapError((cause) => new RunExportError({
42
+ runId,
43
+ operation: "write",
44
+ path: output,
45
+ reason: cause.reason._tag,
46
+ cause,
47
+ })));
48
+ yield* Effect.logInfo("Run evidence exported", {
49
+ runId,
50
+ output,
51
+ attempts: evidence.snapshot.attempts.length,
52
+ transcriptRows: evidence.transcript.length,
53
+ });
54
+ });
55
+ /** Exports from the current instance without loading GitHub credentials or starting execution. */
56
+ export const exportRun = Effect.fn("Cli.exportRun")(function* (runId, output) {
57
+ const directory = InstanceDirectory.make(process.cwd());
58
+ const path = yield* Path.Path;
59
+ const destination = path.resolve(Option.getOrElse(output, () => `run-${encodeURIComponent(runId)}.json`));
60
+ yield* Effect.annotateCurrentSpan({ runId, instanceDirectory: directory, output: destination });
61
+ const databasePath = path.join(directory, ".usine", "runtime.sqlite");
62
+ const reader = runReaderLayer(directory);
63
+ const evidence = yield* Effect.flatMap(RunReader, (reader) => reader.evidence(runId)).pipe(Effect.provide(reader), Effect.mapError((cause) => cause._tag === "RunNotFoundError"
64
+ ? cause
65
+ : new RunExportError({
66
+ runId,
67
+ operation: "read",
68
+ path: databasePath,
69
+ reason: cause._tag,
70
+ cause,
71
+ })));
72
+ yield* writeRunEvidence(evidence, destination);
73
+ yield* Console.log(`Exported Run ${runId} to ${destination}`);
74
+ }, Effect.tapError((error) => Effect.logWarning("Run evidence export failed", Match.valueTags(error, {
75
+ RunNotFoundError: ({ runId, _tag }) => ({ runId, errorTag: _tag }),
76
+ RunExportError: ({ runId, _tag, operation, path, reason, cause }) => ({
77
+ runId,
78
+ errorTag: _tag,
79
+ operation,
80
+ path,
81
+ reason,
82
+ cause,
83
+ }),
84
+ }))));
85
+ //# sourceMappingURL=export-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-run.js","sourceRoot":"","sources":["../src/export-run.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAeA,OAAO,EAAU,KAAK,EAAiB,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAY,UAAU,EAAyC,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAqB,MAAM,cAAc,CAAC;AA4MjE,eAAO,MAAM,SAAS,mGA0DpB,CAAC;AAEH,eAAO,MAAM,YAAY,YAAa,MAAM,4NAsB3C,CAAC;AAEF,eAAO,MAAM,WAAW,YACb,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,WAC3B,MAAM,QACT,MAAM,yFAQb,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAUA,OAAO,EAAU,KAAK,EAAsB,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAW,UAAU,EAAyC,MAAM,sBAAsB,CAAC;AAElG,OAAO,EAAE,cAAc,EAAqB,MAAM,cAAc,CAAC;AA0KjE,eAAO,MAAM,SAAS,mGAIrB,CAAC;AAEF,eAAO,MAAM,YAAY,YAAa,MAAM,4NA2C3C,CAAC;AAEF,eAAO,MAAM,WAAW,YACb,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,WAC3B,MAAM,QACT,MAAM,yFAQb,CAAC"}
package/dist/http.js CHANGED
@@ -1,104 +1,59 @@
1
1
  import { createServer } from "node:http";
2
- import { resolve, sep } from "node:path";
2
+ import { extname, resolve, sep } from "node:path";
3
3
  import { NodeHttpServer } from "@effect/platform-node";
4
- import { Attempt, Item, Loop, Repository, Run } from "@usine/core";
5
- import { BoardLaneId, BoardMove, ColdTranscriptRequest, EarlierTranscriptRequest, FactoryOverview, RunDetailView, TailTranscriptRequest, TranscriptCursor, } from "@usine/orchestrator";
6
- import { Effect, Layer, Match, Schema } from "effect";
7
- import { HttpBody, HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
4
+ import { RepositoryName } from "@usine/core/repository";
5
+ import { BoardMove } from "@usine/orchestrator/operator";
6
+ import { OperatorApi, OperatorHttpError, OperatorHttpPolicy, } from "@usine/orchestrator/operator/http";
7
+ import { Effect, Layer, Schema } from "effect";
8
+ import { Headers, HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
9
+ import { HttpApiBuilder, HttpApiError } from "effect/unstable/httpapi";
8
10
  import { FactoryBackend } from "./backend.js";
9
- const PathRun = Schema.Struct({ runId: Run.RunId });
10
- const PathLoop = Schema.Struct({ loop: Loop.LoopName });
11
- const RepositoryPart = Schema.String.check(Schema.isPattern(/^[A-Za-z0-9_.-]+$/u, { message: "Expected a repository path segment" }));
12
- const PathBoardItem = Schema.Struct({
13
- owner: RepositoryPart,
14
- repository: RepositoryPart,
15
- item: Schema.FiniteFromString.pipe(Schema.decodeTo(Item.Number)),
16
- });
17
- const BoardMoveBody = Schema.Struct({ toLane: BoardLaneId });
18
- const TranscriptCursorFromString = Schema.FiniteFromString.pipe(Schema.decodeTo(TranscriptCursor));
19
- const RunDetailSearch = Schema.Union([
20
- Schema.Struct({ _tag: Schema.Literal("ColdTranscriptRequest") }),
21
- Schema.Struct({
22
- _tag: Schema.Literal("TailTranscriptRequest"),
23
- after: TranscriptCursorFromString,
24
- }),
25
- Schema.Struct({
26
- _tag: Schema.Literal("EarlierTranscriptRequest"),
27
- attemptId: Attempt.AttemptId,
28
- before: TranscriptCursorFromString,
29
- }),
30
- ]);
31
- const ApiOk = Schema.Struct({ ok: Schema.Literal(true) });
32
- const ApiError = Schema.Struct({ error: Schema.String, message: Schema.String });
33
- const ok = HttpServerResponse.schemaJson(ApiOk);
34
- class InvalidRequestError extends Schema.TaggedError("@usine/server/InvalidRequestError")("InvalidRequestError", { message: Schema.String }) {
35
- }
36
- const errorResponse = (error) => {
37
- const response = (() => {
11
+ const operatorFailure = (error) => {
12
+ const message = (() => {
38
13
  switch (error._tag) {
39
14
  case "RunNotFoundError":
40
- return { status: 404, message: `Run ${error.runId} was not found.` };
15
+ return `Run ${error.runId} was not found.`;
41
16
  case "RunOperationRejectedError":
42
- return {
43
- status: 409,
44
- message: `Cannot ${error.operation} Run ${error.runId} while it is ${error.state}.`,
45
- };
17
+ return `Cannot ${error.operation} Run ${error.runId} while it is ${error.state}.`;
18
+ case "CycleBudgetResetRejectedError":
19
+ return `Cycle budget Ask ${error.askId} is no longer awaiting this answer.`;
46
20
  case "TranscriptAttemptNotFoundError":
47
- return {
48
- status: 404,
49
- message: `Attempt ${error.attemptId} does not belong to Run ${error.runId}.`,
50
- };
21
+ return `Attempt ${error.attemptId} does not belong to Run ${error.runId}.`;
51
22
  case "BackendUnavailableError":
52
- return { status: 503, message: error.message };
23
+ case "RunInterventionRejectedError":
24
+ case "RosterAgentNotFoundError":
25
+ return error.message;
53
26
  case "BoardProjectNotFoundError":
54
- return { status: 404, message: `Project ${error.repository} was not found.` };
27
+ return `Project ${error.repository} was not found.`;
55
28
  case "BoardItemNotFoundError":
56
- return {
57
- status: 404,
58
- message: `Item ${error.repository}#${error.item} was not found on the Board.`,
59
- };
29
+ return `Item ${error.repository}#${error.item} was not found on the Board.`;
60
30
  case "BoardLaneNotFoundError":
61
- return { status: 404, message: `Board Lane ${error.lane} was not found.` };
31
+ return `Board Lane ${error.lane} was not found.`;
62
32
  case "BoardLaneReadOnlyError":
63
- return {
64
- status: 409,
65
- message: `Board Lane ${error.lane} is derived from Item state and cannot accept label moves.`,
66
- };
33
+ return `Board Lane ${error.lane} is read-only. Configure label-backed lanes in usine.yaml to enable moves.`;
67
34
  case "InstallationDiscoveryError":
68
35
  case "AppPermissionError":
69
- return { status: 503, message: error.message };
36
+ return error.message;
70
37
  case "GitHubApiError":
71
38
  case "InvalidGitHubResponseError":
72
- return { status: 502, message: error.message };
39
+ return error.message;
73
40
  case "GitHubRateLimitError":
74
- return { status: 503, message: error.message };
41
+ return error.message;
75
42
  case "EnginePersistenceError":
76
- return {
77
- status: 500,
78
- message: `Runtime persistence failed while trying to ${error.operation}.`,
79
- };
43
+ return `Runtime persistence failed while trying to ${error.operation}.`;
80
44
  case "AttemptCancellationError":
81
- return {
82
- status: 500,
83
- message: `Attempt ${error.attemptId} could not be canceled.`,
84
- };
85
- case "SchemaError":
86
- return { status: 400, message: `Invalid request: ${error.message}` };
87
- case "InvalidRequestError":
88
- return { status: 400, message: error.message };
89
- case "HttpBodyError":
90
- return { status: 500, message: "The server could not encode its response." };
45
+ return `Attempt ${error.attemptId} could not be canceled.`;
91
46
  }
92
47
  })();
93
- return HttpServerResponse.schemaJson(ApiError)({ error: error._tag, message: response.message }, { status: response.status }).pipe(Effect.orDie);
48
+ return new OperatorHttpError({ error: error._tag, message });
94
49
  };
95
50
  const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "[::1]", "::1"]);
96
51
  /**
97
52
  * Cross-site request forgery guard. Browsers attach `Origin` to every
98
- * cross-origin request — including the "simple" POSTs this API accepts — so a
99
- * present, non-loopback origin can only be another site driving the
100
- * operator's browser, and its side effect must be refused before the handler
101
- * runs. Requests without the header (curl, same-origin GETs) pass through.
53
+ * cross-origin request, including the simple POSTs this API accepts, so a
54
+ * present non-loopback origin can only be another site driving the operator's
55
+ * browser and its request is refused before the handler runs. Requests without
56
+ * the header (curl, same-origin GETs) pass through.
102
57
  */
103
58
  const crossSiteOrigin = (request) => {
104
59
  const origin = request.headers.origin;
@@ -111,80 +66,69 @@ const crossSiteOrigin = (request) => {
111
66
  return true;
112
67
  }
113
68
  };
114
- const handled = (effect) => Effect.gen(function* () {
69
+ const policy = Layer.succeed(OperatorHttpPolicy)((handler, { endpoint }) => Effect.gen(function* () {
115
70
  const request = yield* HttpServerRequest.HttpServerRequest;
116
71
  if (crossSiteOrigin(request)) {
117
72
  yield* Effect.logWarning("Cross-site request to the operator API was refused", {
118
73
  origin: request.headers.origin,
119
74
  url: request.url,
120
75
  });
121
- return yield* HttpServerResponse.schemaJson(ApiError)({ error: "CrossSiteRequestError", message: "Cross-site requests are refused." }, { status: 403 }).pipe(Effect.orDie);
76
+ return yield* new OperatorHttpError({
77
+ error: "CrossSiteRequestError",
78
+ message: "Cross-site requests are refused.",
79
+ });
122
80
  }
123
- return yield* effect.pipe(Effect.catch(errorResponse));
124
- });
125
- const runAction = (action) => handled(Effect.gen(function* () {
126
- const backend = yield* FactoryBackend;
127
- const { runId } = yield* HttpRouter.schemaPathParams(PathRun);
128
- yield* action(backend, runId);
129
- return yield* ok({ ok: true });
130
- }));
131
- const loopAction = (action) => handled(Effect.gen(function* () {
132
- const backend = yield* FactoryBackend;
133
- const { loop } = yield* HttpRouter.schemaPathParams(PathLoop);
134
- yield* action(backend, loop);
135
- return yield* ok({ ok: true });
81
+ // The operator API has always accepted JSON regardless of Content-Type,
82
+ // including simple browser POSTs. Keep that convention behind the origin guard.
83
+ const decoded = endpoint.payload.size === 0
84
+ ? handler
85
+ : handler.pipe(Effect.provideService(HttpServerRequest.HttpServerRequest, request.modify({
86
+ headers: Headers.set(request.headers, "content-type", "application/json"),
87
+ })));
88
+ return yield* decoded.pipe(Effect.catch((error) => {
89
+ if (!HttpApiError.HttpApiSchemaError.is(error))
90
+ return Effect.fail(error);
91
+ const responseEncoding = error.kind === "Body" || error.kind === "ResponseHeaders";
92
+ return Effect.fail(new OperatorHttpError({
93
+ error: responseEncoding
94
+ ? "HttpBodyError"
95
+ : error.kind === "Payload"
96
+ ? "InvalidRequestError"
97
+ : "SchemaError",
98
+ message: responseEncoding
99
+ ? "The server could not encode its response."
100
+ : `Invalid request: ${error.cause.message}`,
101
+ }));
102
+ }));
136
103
  }));
137
- const transcriptRequest = (request) => {
138
- const params = new URL(request.url, "http://localhost").searchParams;
139
- const after = params.get("after");
140
- const before = params.get("before");
141
- const attemptId = params.get("attempt");
142
- const input = after === null && before === null && attemptId === null
143
- ? { _tag: "ColdTranscriptRequest" }
144
- : after !== null && before === null && attemptId === null
145
- ? { _tag: "TailTranscriptRequest", after }
146
- : after === null && before !== null && attemptId !== null
147
- ? { _tag: "EarlierTranscriptRequest", attemptId, before }
148
- : { _tag: "InvalidTranscriptRequest" };
149
- return Schema.decodeUnknownEffect(RunDetailSearch)(input, { onExcessProperty: "error" }).pipe(Effect.map((search) => Match.valueTags(search, {
150
- ColdTranscriptRequest: () => new ColdTranscriptRequest(),
151
- TailTranscriptRequest: ({ after }) => new TailTranscriptRequest({ after }),
152
- EarlierTranscriptRequest: ({ attemptId, before }) => new EarlierTranscriptRequest({ attemptId, before }),
104
+ const acknowledge = (effect) => Effect.as(effect, { ok: true });
105
+ const fromBackend = (use) => Effect.flatMap(FactoryBackend, use).pipe(Effect.mapError(operatorFailure));
106
+ const handlers = HttpApiBuilder.group(OperatorApi, "operator", (routes) => routes
107
+ .handle("overview", () => fromBackend((backend) => backend.overview))
108
+ .handle("agents", () => fromBackend((backend) => backend.agents))
109
+ .handle("editAndRetry", ({ params, payload }) => fromBackend((backend) => backend.editAndRetry(params.runId, payload)).pipe(acknowledge))
110
+ .handle("intervene", ({ params, payload }) => fromBackend((backend) => backend.intervene(params.runId, payload)).pipe(acknowledge))
111
+ .handle("resetCycleBudget", ({ payload }) => fromBackend((backend) => backend.resetCycleBudget(payload.askId)).pipe(acknowledge))
112
+ .handle("detail", ({ params, query }) => fromBackend((backend) => backend.detail(params.runId, query)))
113
+ .handle("approve", ({ params }) => fromBackend((backend) => backend.approve(params.runId)).pipe(acknowledge))
114
+ .handle("retry", ({ params }) => fromBackend((backend) => backend.retry(params.runId)).pipe(acknowledge))
115
+ .handle("cancel", ({ params }) => fromBackend((backend) => backend.cancel(params.runId)).pipe(acknowledge))
116
+ .handle("moveBoardItem", Effect.fn("Http.boardMove")(function* ({ params, payload }) {
117
+ const repository = yield* Schema.decodeUnknownEffect(RepositoryName)(`${params.owner}/${params.repository}`).pipe(Effect.mapError((error) => new OperatorHttpError({
118
+ error: "SchemaError",
119
+ message: `Invalid request: ${error.message}`,
153
120
  })));
154
- };
155
- const boardMove = Effect.fn("Http.boardMove")(function* () {
156
- const { owner, repository: name, item } = yield* HttpRouter.schemaPathParams(PathBoardItem);
157
- const repository = yield* Schema.decodeUnknownEffect(Repository.Name)(`${owner}/${name}`);
158
- const { toLane } = yield* HttpServerRequest.schemaBodyJson(BoardMoveBody, {
159
- onExcessProperty: "error",
160
- }).pipe(Effect.mapError((error) => new InvalidRequestError({ message: `Invalid request: ${error.message}` })));
161
- return new BoardMove({ repository, item, toLane });
162
- });
163
- export const apiRoutes = HttpRouter.addAll([
164
- HttpRouter.route("GET", "/api/overview", handled(Effect.gen(function* () {
165
- const backend = yield* FactoryBackend;
166
- return yield* HttpServerResponse.schemaJson(FactoryOverview)(yield* backend.overview);
167
- }))),
168
- HttpRouter.route("GET", "/api/runs/:runId", (request) => handled(Effect.gen(function* () {
169
- const backend = yield* FactoryBackend;
170
- const { runId } = yield* HttpRouter.schemaPathParams(PathRun);
171
- return yield* HttpServerResponse.schemaJson(RunDetailView)(yield* backend.detail(runId, yield* transcriptRequest(request)));
172
- }))),
173
- HttpRouter.route("POST", "/api/runs/:runId/approve", runAction((backend, id) => backend.approve(id))),
174
- HttpRouter.route("POST", "/api/projects/:owner/:repository/items/:item/lane", handled(Effect.gen(function* () {
175
- const backend = yield* FactoryBackend;
176
- yield* backend.moveBoardItem(yield* boardMove());
177
- return yield* ok({ ok: true });
178
- }))),
179
- HttpRouter.route("POST", "/api/runs/:runId/retry", runAction((backend, id) => backend.retry(id))),
180
- HttpRouter.route("POST", "/api/runs/:runId/cancel", runAction((backend, id) => backend.cancel(id))),
181
- HttpRouter.route("POST", "/api/loops/:loop/pause", loopAction((backend, loop) => backend.pause(loop))),
182
- HttpRouter.route("POST", "/api/loops/:loop/unpause", loopAction((backend, loop) => backend.unpause(loop))),
183
- ]);
121
+ yield* Effect.annotateCurrentSpan({ repository, item: params.item, lane: payload.toLane });
122
+ return yield* fromBackend((backend) => backend.moveBoardItem(new BoardMove({ repository, item: params.item, toLane: payload.toLane }))).pipe(acknowledge);
123
+ }))
124
+ .handle("pause", ({ params }) => fromBackend((backend) => backend.pause(params.loop)).pipe(acknowledge))
125
+ .handle("unpause", ({ params }) => fromBackend((backend) => backend.unpause(params.loop)).pipe(acknowledge)));
126
+ export const apiRoutes = HttpApiBuilder.layer(OperatorApi).pipe(Layer.provide(handlers), Layer.provide(policy), Layer.provide(NodeHttpServer.layerHttpServices));
184
127
  export const staticRoutes = (webRoot) => {
185
128
  const assetsRoot = resolve(webRoot, "assets");
129
+ const applicationShell = HttpServerResponse.file(resolve(webRoot, "index.html"));
186
130
  return HttpRouter.addAll([
187
- HttpRouter.route("GET", "/", HttpServerResponse.file(resolve(webRoot, "index.html"))),
131
+ HttpRouter.route("GET", "/", applicationShell),
188
132
  HttpRouter.route("GET", "/assets/*", (request) => Effect.gen(function* () {
189
133
  const pathname = decodeURIComponent(new URL(request.url, "http://localhost").pathname);
190
134
  const asset = resolve(webRoot, pathname.slice(1));
@@ -196,6 +140,23 @@ export const staticRoutes = (webRoot) => {
196
140
  message: String(error),
197
141
  }).pipe(Effect.as(HttpServerResponse.text("Not found", { status: 404 })))));
198
142
  })),
143
+ HttpRouter.route("GET", "*", (request) => Effect.gen(function* () {
144
+ const pathname = decodeURIComponent(new URL(request.url, "http://localhost").pathname);
145
+ const reservedNamespace = pathname === "/api" ||
146
+ pathname.startsWith("/api/") ||
147
+ pathname === "/assets" ||
148
+ pathname.startsWith("/assets/");
149
+ const hasFileExtension = extname(pathname) !== "";
150
+ if (reservedNamespace || hasFileExtension) {
151
+ yield* Effect.logDebug("Request was not eligible for the application shell fallback", {
152
+ pathname,
153
+ reason: reservedNamespace ? "reserved-namespace" : "file-extension",
154
+ });
155
+ return HttpServerResponse.text("Not found", { status: 404 });
156
+ }
157
+ yield* Effect.logDebug("Serving the application shell for a client route", { pathname });
158
+ return yield* applicationShell;
159
+ })),
199
160
  ]);
200
161
  };
201
162
  export const serverLayer = (backend, webRoot, port) => {
package/dist/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,3 @@
1
- /**
2
- * @usine/server — the usine orchestrator as a headless server: a thin CLI over
3
- * @usine/orchestrator that serves the web UI.
4
- *
5
- * The published `usine` binary lives in main.ts. Application behavior stays
6
- * in @usine/orchestrator; this package owns only Node and HTTP adaptation.
7
- */
1
+ /** This package publishes the `usine` binary from main.ts and no library surface; the empty export keeps its TypeScript project explicit. */
8
2
  export {};
9
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6IAA6I;AAE7I,OAAO,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -1,9 +1,3 @@
1
- /**
2
- * @usine/server — the usine orchestrator as a headless server: a thin CLI over
3
- * @usine/orchestrator that serves the web UI.
4
- *
5
- * The published `usine` binary lives in main.ts. Application behavior stays
6
- * in @usine/orchestrator; this package owns only Node and HTTP adaptation.
7
- */
1
+ /** This package publishes the `usine` binary from main.ts and no library surface; the empty export keeps its TypeScript project explicit. */
8
2
  export {};
9
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6IAA6I;AAE7I,OAAO,EAAE,CAAC"}
package/dist/main.js CHANGED
@@ -2,20 +2,30 @@
2
2
  import { NodeRuntime, NodeServices } from "@effect/platform-node";
3
3
  import { Console, Effect, Match, Option } from "effect";
4
4
  import { CLI_USAGE, packageVersion, parseCli } from "./cli.js";
5
+ const exitWith = (message) => Console.error(message).pipe(Effect.andThen(Effect.sync(() => {
6
+ process.exitCode = 1;
7
+ })));
5
8
  const main = Effect.gen(function* () {
6
- const command = yield* parseCli(process.argv.slice(2), Option.fromNullishOr(process.env.USINE_PORT));
9
+ const command = yield* parseCli(process.argv.slice(2), {
10
+ port: Option.fromNullishOr(process.env.USINE_PORT),
11
+ allowVolatileInstance: Option.fromNullishOr(process.env.USINE_ALLOW_VOLATILE_INSTANCE),
12
+ });
7
13
  return yield* Match.valueTags(command, {
8
14
  HelpCommand: () => Console.log(CLI_USAGE),
9
15
  VersionCommand: () => Effect.flatMap(packageVersion(), Console.log),
10
- UpCommand: ({ port }) => Effect.flatMap(Effect.promise(() => import("./up.js")), ({ up }) => up(port)),
16
+ ExportRunCommand: ({ runId, output }) => Effect.flatMap(Effect.promise(() => import("./export-run.js")), ({ exportRun }) => exportRun(runId, output)),
17
+ BackupCommand: ({ output }) => Effect.flatMap(Effect.promise(() => import("./backup.js")), ({ backup }) => backup(output)),
18
+ UpCommand: ({ port, allowVolatileInstance }) => Effect.flatMap(Effect.promise(() => import("./up.js")), ({ up }) => up(port, allowVolatileInstance)),
11
19
  });
12
20
  }).pipe(Effect.provide(NodeServices.layer), Effect.catchTags({
13
- CliUsageError: ({ message }) => Console.error(message).pipe(Effect.andThen(Effect.sync(() => {
14
- process.exitCode = 1;
15
- }))),
16
- PortInUseError: ({ port }) => Console.error(`Port ${port} is already in use. Stop the process using it or run usine up --port <port>.`).pipe(Effect.andThen(Effect.sync(() => {
17
- process.exitCode = 1;
18
- }))),
21
+ CliUsageError: ({ message }) => exitWith(message),
22
+ RunNotFoundError: ({ runId }) => exitWith(`Run ${runId} was not found.`),
23
+ RunExportError: ({ runId, operation, path, reason }) => exitWith(`Could not ${operation} evidence for Run ${runId} at ${path} (${reason}). Check the instance database and choose a new writable output path.`),
24
+ RuntimeStoreBackupError: ({ operation, source, destination, reason }) => exitWith(Match.value(operation).pipe(Match.when("open", () => `Could not open ${source} (${reason}). Run usine backup from the instance folder containing .usine/runtime.sqlite.`), Match.when("copy", () => `Could not copy ${source} to ${destination} (${reason}). Check the source database and the output directory's free space and permissions.`), Match.when("stage", () => `Could not create a backup at ${destination} (${reason}). Choose an existing writable output directory.`), Match.when("publish", () => reason === "AlreadyExists"
25
+ ? `Could not save the backup to ${destination} (${reason}). Choose a different filename; the destination already exists.`
26
+ : `Could not save the backup to ${destination} (${reason}). Check the destination path and permissions; its filesystem must support hard links.`), Match.exhaustive)),
27
+ VolatileInstanceDirectoryError: ({ directory, root }) => exitWith(`Refusing to start: ${directory} sits under ${root}, which the OS clears. The runtime store there is the only copy of every Run and transcript. Move the instance folder, or pass --allow-volatile-instance (or USINE_ALLOW_VOLATILE_INSTANCE=1) to proceed anyway.`),
28
+ PortInUseError: ({ port }) => exitWith(`Port ${port} is already in use. Stop the process using it or run usine up --port <port>.`),
19
29
  }));
20
30
  NodeRuntime.runMain(main);
21
31
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE/D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,QAAQ,CAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EACrB,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAC7C,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE;QACrC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QACzC,cAAc,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC;QACnE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACtB,MAAM,CAAC,OAAO,CACZ,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EACvC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CACrB;KACJ,CAAC,CAAC;AACL,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAClC,MAAM,CAAC,SAAS,CAAC;IACf,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAC7B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CACzB,MAAM,CAAC,OAAO,CACZ,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CACH,CACF;IACH,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAC3B,OAAO,CAAC,KAAK,CACX,QAAQ,IAAI,8EAA8E,CAC3F,CAAC,IAAI,CACJ,MAAM,CAAC,OAAO,CACZ,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CACH,CACF;CACJ,CAAC,CACH,CAAC;AAEF,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Deferred, Duration, Effect, Scope } from "effect";
2
+ /** Protects startup and running work with a bounded drain before runtime resources close. */
3
+ export declare const withGracefulShutdown: <A, E, R, E2, R2>(startup: Effect.Effect<{
4
+ readonly running: Effect.Effect<A, E, R>;
5
+ readonly drain: Effect.Effect<void>;
6
+ }, E2, R2>, requested: Deferred.Deferred<void>, deadline: Duration.Duration) => Effect.Effect<A, E | E2, Exclude<Exclude<R, Scope.Scope>, Scope.Scope> | Exclude<Exclude<R2, Scope.Scope>, Scope.Scope>>;
7
+ //# sourceMappingURL=shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAuB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAuBhF,6FAA6F;AAC7F,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,WACzC,MAAM,CAAC,MAAM,CACpB;IACE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACrC,EACD,EAAE,EACF,EAAE,CACH,aACU,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,YACxB,QAAQ,CAAC,QAAQ,6HAsE1B,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { Deferred, Duration, Effect, Exit, Fiber, Option, Scope } from "effect";
2
+ // This listener runs before NodeRuntime's main-fiber interruption. Admission is
3
+ // closed synchronously at the signal boundary, including during Layer startup.
4
+ const observeSignals = (requested, forced) => Effect.acquireRelease(Effect.sync(() => {
5
+ let received = 0;
6
+ const onSignal = () => {
7
+ received += 1;
8
+ Deferred.doneUnsafe(received === 1 ? requested : forced, Effect.void);
9
+ };
10
+ process.prependListener("SIGINT", onSignal);
11
+ process.prependListener("SIGTERM", onSignal);
12
+ return onSignal;
13
+ }), (onSignal) => Effect.sync(() => {
14
+ process.removeListener("SIGINT", onSignal);
15
+ process.removeListener("SIGTERM", onSignal);
16
+ }));
17
+ /** Protects startup and running work with a bounded drain before runtime resources close. */
18
+ export const withGracefulShutdown = (startup, requested, deadline) => Effect.scoped(Effect.gen(function* () {
19
+ const forced = yield* Deferred.make();
20
+ yield* observeSignals(requested, forced);
21
+ // Acquired before the forks: their shutdown completes while runtime
22
+ // resources (database, executor, HTTP) are still available.
23
+ const runtimeScope = yield* Effect.acquireRelease(Scope.make(), (scope, exit) => Scope.close(scope, exit));
24
+ const started = yield* Effect.forkScoped(Scope.provide(startup, runtimeScope));
25
+ const running = yield* Effect.forkScoped(Fiber.join(started).pipe(Effect.flatMap(({ running }) => Deferred.isDone(requested).pipe(Effect.flatMap((stopped) => stopped ? Effect.never : Scope.provide(running, runtimeScope))))));
26
+ return yield* Fiber.join(running).pipe(Effect.onInterrupt(() => Effect.gen(function* () {
27
+ yield* Deferred.succeed(requested, undefined);
28
+ yield* Effect.logInfo("Orchestrator shutdown started", {
29
+ deadlineMilliseconds: Duration.toMillis(deadline),
30
+ });
31
+ const stopping = yield* Effect.forkScoped(Fiber.interrupt(running).pipe(Effect.interruptible), { startImmediately: true });
32
+ const drain = Fiber.join(started).pipe(Effect.matchEffect({
33
+ onFailure: (error) => Effect.logWarning("Runtime startup failed during shutdown", { error }),
34
+ onSuccess: ({ drain }) => drain,
35
+ }));
36
+ // Finalizers are uninterruptible; raced waits must remain
37
+ // interruptible so the losing drain or signal wait can be stopped.
38
+ const outcome = yield* Effect.raceFirst(Effect.all([drain, Fiber.join(stopping)], { concurrency: "unbounded" }).pipe(Effect.timeoutOption(deadline), Effect.map((result) => Option.isSome(result) ? "drained" : "deadline"), Effect.interruptible), Deferred.await(forced).pipe(Effect.as("forced"), Effect.interruptible));
39
+ if (outcome === "drained") {
40
+ yield* Effect.logInfo("Orchestrator exiting after graceful drain");
41
+ }
42
+ else {
43
+ yield* Effect.logWarning("Orchestrator stopping before drain completed; unfinished Attempts will recover on restart", { reason: outcome });
44
+ // Cancel Attempts now, even if a trigger's finalizer is slow.
45
+ yield* Effect.all([Fiber.interrupt(started), Scope.close(runtimeScope, Exit.interrupt())], { concurrency: "unbounded" });
46
+ }
47
+ })));
48
+ }));
49
+ //# sourceMappingURL=shutdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"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"}