@knpkv/alchemy-console 0.0.0-stage → 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.
- package/LICENSE +21 -0
- package/README.md +185 -2
- package/dist/api.d.ts +126 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +62 -0
- package/dist/api.js.map +1 -0
- package/dist/client/bootstrap.js +2834 -0
- package/dist/discovery.d.ts +12 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +39 -0
- package/dist/discovery.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/files.d.ts +9 -0
- package/dist/internal/files.d.ts.map +1 -0
- package/dist/internal/files.js +34 -0
- package/dist/internal/files.js.map +1 -0
- package/dist/local-state.d.ts +8 -0
- package/dist/local-state.d.ts.map +1 -0
- package/dist/local-state.js +53 -0
- package/dist/local-state.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +39 -0
- package/dist/main.js.map +1 -0
- package/dist/profiles.d.ts +24 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +82 -0
- package/dist/profiles.js.map +1 -0
- package/dist/s3-live.d.ts +13 -0
- package/dist/s3-live.d.ts.map +1 -0
- package/dist/s3-live.js +112 -0
- package/dist/s3-live.js.map +1 -0
- package/dist/s3-reader.d.ts +46 -0
- package/dist/s3-reader.d.ts.map +1 -0
- package/dist/s3-reader.js +10 -0
- package/dist/s3-reader.js.map +1 -0
- package/dist/s3-state.d.ts +21 -0
- package/dist/s3-state.d.ts.map +1 -0
- package/dist/s3-state.js +129 -0
- package/dist/s3-state.js.map +1 -0
- package/dist/schema.d.ts +43 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +27 -0
- package/dist/schema.js.map +1 -0
- package/dist/server/Bootstrap.d.ts +4 -0
- package/dist/server/Bootstrap.d.ts.map +1 -0
- package/dist/server/Bootstrap.js +12 -0
- package/dist/server/Bootstrap.js.map +1 -0
- package/dist/server/Catalog.d.ts +27 -0
- package/dist/server/Catalog.d.ts.map +1 -0
- package/dist/server/Catalog.js +83 -0
- package/dist/server/Catalog.js.map +1 -0
- package/dist/server/Config.d.ts +17 -0
- package/dist/server/Config.d.ts.map +1 -0
- package/dist/server/Config.js +23 -0
- package/dist/server/Config.js.map +1 -0
- package/dist/server/ControlSocket.d.ts +19 -0
- package/dist/server/ControlSocket.d.ts.map +1 -0
- package/dist/server/ControlSocket.js +147 -0
- package/dist/server/ControlSocket.js.map +1 -0
- package/dist/server/HttpApplication.d.ts +7 -0
- package/dist/server/HttpApplication.d.ts.map +1 -0
- package/dist/server/HttpApplication.js +46 -0
- package/dist/server/HttpApplication.js.map +1 -0
- package/dist/server/Launch.d.ts +7 -0
- package/dist/server/Launch.d.ts.map +1 -0
- package/dist/server/Launch.js +17 -0
- package/dist/server/Launch.js.map +1 -0
- package/dist/server/OwnerSession.d.ts +9 -0
- package/dist/server/OwnerSession.d.ts.map +1 -0
- package/dist/server/OwnerSession.js +27 -0
- package/dist/server/OwnerSession.js.map +1 -0
- package/dist/server/Server.d.ts +6 -0
- package/dist/server/Server.d.ts.map +1 -0
- package/dist/server/Server.js +22 -0
- package/dist/server/Server.js.map +1 -0
- package/dist/server/Sources.d.ts +12 -0
- package/dist/server/Sources.d.ts.map +1 -0
- package/dist/server/Sources.js +118 -0
- package/dist/server/Sources.js.map +1 -0
- package/dist/sso-credentials.d.ts +17 -0
- package/dist/sso-credentials.d.ts.map +1 -0
- package/dist/sso-credentials.js +43 -0
- package/dist/sso-credentials.js.map +1 -0
- package/dist/state.d.ts +15 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +45 -0
- package/dist/state.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +61 -0
- package/dist/version.js.map +1 -0
- package/package.json +60 -3
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Context, Schema } from "effect";
|
|
2
|
+
/** No raw provider error, credentials or locator is retained. */
|
|
3
|
+
export class S3ReadError extends Schema.TaggedError()("S3ReadError", {
|
|
4
|
+
reason: Schema.Literals(["authentication", "denied", "not-found", "provider", "invalid-response", "limit"])
|
|
5
|
+
}) {
|
|
6
|
+
}
|
|
7
|
+
/** Bound to one explicit SSO profile. No writes, Alchemy runtime, credential chain or implicit login. */
|
|
8
|
+
export class S3Reader extends Context.Service()("@knpkv/alchemy-console/S3Reader") {
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=s3-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-reader.js","sourceRoot":"","sources":["../src/s3-reader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAmCxC,iEAAiE;AACjE,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,WAAW,EAAe,CAAC,aAAa,EAAE;IAChF,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;CAC5G,CAAC;CAAG;AAEL,yGAAyG;AACzG,MAAM,OAAO,QAAS,SAAQ,OAAO,CAAC,OAAO,EAWzC,CAAC,iCAAiC,CAAC;CAAG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { type S3Bucket, S3Reader, S3ReadError, type S3Version } from "./s3-reader.js";
|
|
3
|
+
import { type StackState, StateReadError } from "./schema.js";
|
|
4
|
+
/** Server-private persisted bucket/prefix coordinates. Keep in server memory, never HTTP, browser storage, logs or telemetry. */
|
|
5
|
+
export interface S3StackLocator {
|
|
6
|
+
readonly bucket: S3Bucket;
|
|
7
|
+
readonly prefix: string;
|
|
8
|
+
readonly app: string;
|
|
9
|
+
readonly stage: string;
|
|
10
|
+
}
|
|
11
|
+
/** Discover owned candidate buckets; caller may supply a different naming predicate or explicit bucket locators. */
|
|
12
|
+
export declare const discoverS3Buckets: (matches?: ((name: string) => boolean) | undefined) => Effect.Effect<S3Bucket[], S3ReadError, S3Reader>;
|
|
13
|
+
/** List version IDs and deletion markers without reading any payload. Both continuation markers are retained. */
|
|
14
|
+
export declare const listS3Versions: (bucket: S3Bucket, prefix?: any) => Effect.Effect<S3Version[], S3ReadError, S3Reader>;
|
|
15
|
+
/** Infer optional state prefixes from the last three key components. Latest delete markers never resurrect old stacks. */
|
|
16
|
+
export declare const discoverS3Stacks: (bucket: S3Bucket) => Effect.Effect<S3StackLocator[], S3ReadError, S3Reader>;
|
|
17
|
+
/** Read one exact persisted version. Keys must be direct JSON children of the server-selected stack. */
|
|
18
|
+
export declare const readS3Resource: (stack: S3StackLocator, key: string, versionId: string) => Effect.Effect<import("./schema.js").ResourceSummary | null, S3ReadError | StateReadError, S3Reader>;
|
|
19
|
+
/** Pin each latest object to its listed version ID. S3 is not a transactional snapshot across resources. */
|
|
20
|
+
export declare const readS3State: (stack: S3StackLocator, alchemyVersion?: string | null | undefined) => Effect.Effect<StackState, S3ReadError | StateReadError, S3Reader>;
|
|
21
|
+
//# sourceMappingURL=s3-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-state.d.ts","sourceRoot":"","sources":["../src/s3-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EACL,KAAK,QAAQ,EAEb,QAAQ,EACR,WAAW,EACX,KAAK,SAAS,EAGf,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE7D,iIAAiI;AACjI,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,oHAAoH;AACpH,eAAO,MAAM,iBAAiB,qBACZ,MAAM,KAAK,OAAO,kEAqBlC,CAAA;AAEF,iHAAiH;AACjH,eAAO,MAAM,cAAc,uFAsBzB,CAAA;AAYF,0HAA0H;AAC1H,eAAO,MAAM,gBAAgB,8EAoB3B,CAAA;AAIF,wGAAwG;AACxG,eAAO,MAAM,cAAc,gKAmBzB,CAAA;AAEF,4GAA4G;AAC5G,eAAO,MAAM,WAAW,0IAwBtB,CAAA"}
|
package/dist/s3-state.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { S3Reader, S3ReadError } from "./s3-reader.js";
|
|
3
|
+
import { StateReadError } from "./schema.js";
|
|
4
|
+
/** Discover owned candidate buckets; caller may supply a different naming predicate or explicit bucket locators. */
|
|
5
|
+
export const discoverS3Buckets = Effect.fn("AlchemyConsole.discoverS3Buckets")(function* (matches = (name) => name.includes("alchemy-state")) {
|
|
6
|
+
const reader = yield* S3Reader;
|
|
7
|
+
const buckets = new Map();
|
|
8
|
+
const seen = new Set();
|
|
9
|
+
let cursor = null;
|
|
10
|
+
let count = 0;
|
|
11
|
+
let pages = 0;
|
|
12
|
+
do {
|
|
13
|
+
if (++pages > 100)
|
|
14
|
+
return yield* new S3ReadError({ reason: "limit" });
|
|
15
|
+
const page = yield* reader.buckets(cursor);
|
|
16
|
+
count += page.buckets.length;
|
|
17
|
+
if (count > 50_000)
|
|
18
|
+
return yield* new S3ReadError({ reason: "limit" });
|
|
19
|
+
for (const bucket of page.buckets)
|
|
20
|
+
if (matches(bucket.name))
|
|
21
|
+
buckets.set(bucket.name, bucket);
|
|
22
|
+
cursor = page.next;
|
|
23
|
+
if (cursor !== null) {
|
|
24
|
+
if (seen.has(cursor))
|
|
25
|
+
return yield* new S3ReadError({ reason: "invalid-response" });
|
|
26
|
+
seen.add(cursor);
|
|
27
|
+
}
|
|
28
|
+
} while (cursor !== null);
|
|
29
|
+
return [...buckets.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
30
|
+
});
|
|
31
|
+
/** List version IDs and deletion markers without reading any payload. Both continuation markers are retained. */
|
|
32
|
+
export const listS3Versions = Effect.fn("AlchemyConsole.listS3Versions")(function* (bucket, prefix = "") {
|
|
33
|
+
const reader = yield* S3Reader;
|
|
34
|
+
const versions = [];
|
|
35
|
+
const seen = new Set();
|
|
36
|
+
let cursor = null;
|
|
37
|
+
let pages = 0;
|
|
38
|
+
do {
|
|
39
|
+
if (++pages > 100)
|
|
40
|
+
return yield* new S3ReadError({ reason: "limit" });
|
|
41
|
+
const page = yield* reader.versions(bucket, prefix, cursor);
|
|
42
|
+
if (versions.length + page.versions.length > 50_000)
|
|
43
|
+
return yield* new S3ReadError({ reason: "limit" });
|
|
44
|
+
for (const version of page.versions)
|
|
45
|
+
versions.push(version);
|
|
46
|
+
if (page.versions.some((version) => !version.key.startsWith(prefix))) {
|
|
47
|
+
return yield* new S3ReadError({ reason: "invalid-response" });
|
|
48
|
+
}
|
|
49
|
+
cursor = page.next;
|
|
50
|
+
if (cursor !== null) {
|
|
51
|
+
const identity = JSON.stringify([cursor.key, cursor.versionId]);
|
|
52
|
+
if (seen.has(identity))
|
|
53
|
+
return yield* new S3ReadError({ reason: "invalid-response" });
|
|
54
|
+
seen.add(identity);
|
|
55
|
+
}
|
|
56
|
+
} while (cursor !== null);
|
|
57
|
+
return versions;
|
|
58
|
+
});
|
|
59
|
+
const latestVersions = Effect.fn("AlchemyConsole.latestS3Versions")(function* (versions) {
|
|
60
|
+
const latest = new Map();
|
|
61
|
+
for (const version of versions) {
|
|
62
|
+
if (!version.latest)
|
|
63
|
+
continue;
|
|
64
|
+
if (latest.has(version.key))
|
|
65
|
+
return yield* new S3ReadError({ reason: "invalid-response" });
|
|
66
|
+
latest.set(version.key, version);
|
|
67
|
+
}
|
|
68
|
+
return [...latest.values()].filter((version) => !version.deleted);
|
|
69
|
+
});
|
|
70
|
+
/** Infer optional state prefixes from the last three key components. Latest delete markers never resurrect old stacks. */
|
|
71
|
+
export const discoverS3Stacks = Effect.fn("AlchemyConsole.discoverS3Stacks")(function* (bucket) {
|
|
72
|
+
const versions = yield* latestVersions(yield* listS3Versions(bucket));
|
|
73
|
+
const stacks = new Map();
|
|
74
|
+
for (const { key } of versions) {
|
|
75
|
+
const parts = key.split("/");
|
|
76
|
+
const name = parts.at(-1);
|
|
77
|
+
const stage = parts.at(-2);
|
|
78
|
+
const app = parts.at(-3);
|
|
79
|
+
if (name?.endsWith(".json") !== true || app === undefined || app.length === 0 || stage === undefined ||
|
|
80
|
+
stage.length === 0 || parts.some((part) => part.length === 0 || part === "." || part === "..")) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const prefix = parts.length === 3 ? "" : `${parts.slice(0, -3).join("/")}/`;
|
|
84
|
+
stacks.set(JSON.stringify([prefix, app, stage]), { bucket, prefix, app, stage });
|
|
85
|
+
}
|
|
86
|
+
return [...stacks.values()].sort((a, b) => a.prefix.localeCompare(b.prefix) || a.app.localeCompare(b.app) || a.stage.localeCompare(b.stage));
|
|
87
|
+
});
|
|
88
|
+
const stagePrefix = (stack) => `${stack.prefix}${stack.app}/${stack.stage}/`;
|
|
89
|
+
/** Read one exact persisted version. Keys must be direct JSON children of the server-selected stack. */
|
|
90
|
+
export const readS3Resource = Effect.fn("AlchemyConsole.readS3Resource")(function* (stack, key, versionId) {
|
|
91
|
+
const prefix = stagePrefix(stack);
|
|
92
|
+
const name = key.slice(prefix.length);
|
|
93
|
+
if (!key.startsWith(prefix) || name.includes("/") || !name.endsWith(".json") || name === "__stack_output__.json" ||
|
|
94
|
+
versionId.length === 0) {
|
|
95
|
+
return yield* new StateReadError({ reason: "invalid-state" });
|
|
96
|
+
}
|
|
97
|
+
const reader = yield* S3Reader;
|
|
98
|
+
const resource = yield* reader.resource(stack.bucket, key, versionId);
|
|
99
|
+
if (resource !== null && name !== `${resource.fqn.replaceAll("/", "__")}.json`) {
|
|
100
|
+
return yield* new StateReadError({ reason: "invalid-state" });
|
|
101
|
+
}
|
|
102
|
+
return resource;
|
|
103
|
+
});
|
|
104
|
+
/** Pin each latest object to its listed version ID. S3 is not a transactional snapshot across resources. */
|
|
105
|
+
export const readS3State = Effect.fn("AlchemyConsole.readS3State")(function* (stack, alchemyVersion = null) {
|
|
106
|
+
if (alchemyVersion !== null && alchemyVersion !== "2.0.0-beta.74" && alchemyVersion !== "2.0.0-beta.77") {
|
|
107
|
+
return yield* new StateReadError({ reason: "unsupported-version" });
|
|
108
|
+
}
|
|
109
|
+
const prefix = stagePrefix(stack);
|
|
110
|
+
const versions = yield* latestVersions(yield* listS3Versions(stack.bucket, prefix));
|
|
111
|
+
const resources = [];
|
|
112
|
+
for (const version of versions) {
|
|
113
|
+
if (!version.key.endsWith(".json") || version.key === `${prefix}__stack_output__.json`)
|
|
114
|
+
continue;
|
|
115
|
+
const resource = yield* readS3Resource(stack, version.key, version.versionId);
|
|
116
|
+
if (resource !== null)
|
|
117
|
+
resources.push(resource);
|
|
118
|
+
}
|
|
119
|
+
const state = {
|
|
120
|
+
app: stack.app,
|
|
121
|
+
stage: stack.stage,
|
|
122
|
+
backend: "s3",
|
|
123
|
+
alchemyVersion,
|
|
124
|
+
lastDeploy: null,
|
|
125
|
+
resources: resources.sort((a, b) => a.fqn.localeCompare(b.fqn))
|
|
126
|
+
};
|
|
127
|
+
return state;
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=s3-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-state.js","sourceRoot":"","sources":["../src/s3-state.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
export declare const ResourceSummary: Schema.Struct<{
|
|
3
|
+
readonly fqn: Schema.NonEmptyString;
|
|
4
|
+
readonly logicalId: Schema.NonEmptyString;
|
|
5
|
+
readonly resourceType: Schema.NonEmptyString;
|
|
6
|
+
readonly status: Schema.Literals<readonly ["creating", "created", "updating", "updated", "deleting", "replacing", "replaced"]>;
|
|
7
|
+
readonly parent: Schema.NullOr<Schema.String>;
|
|
8
|
+
readonly providerId: Schema.NullOr<Schema.String>;
|
|
9
|
+
readonly account: Schema.NullOr<Schema.String>;
|
|
10
|
+
readonly region: Schema.NullOr<Schema.String>;
|
|
11
|
+
readonly consoleUrl: Schema.NullOr<Schema.String>;
|
|
12
|
+
}>;
|
|
13
|
+
export interface ResourceSummary extends Schema.Schema.Type<typeof ResourceSummary> {
|
|
14
|
+
}
|
|
15
|
+
/** Safe metadata for an authenticated owner. Never includes state paths, props, outputs, or credentials. */
|
|
16
|
+
export declare const StackState: Schema.Struct<{
|
|
17
|
+
readonly app: Schema.NonEmptyString;
|
|
18
|
+
readonly stage: Schema.NonEmptyString;
|
|
19
|
+
readonly backend: Schema.Literals<readonly ["local", "s3"]>;
|
|
20
|
+
readonly alchemyVersion: Schema.NullOr<Schema.String>;
|
|
21
|
+
readonly lastDeploy: Schema.NullOr<Schema.String>;
|
|
22
|
+
readonly resources: Schema.$Array<Schema.Struct<{
|
|
23
|
+
readonly fqn: Schema.NonEmptyString;
|
|
24
|
+
readonly logicalId: Schema.NonEmptyString;
|
|
25
|
+
readonly resourceType: Schema.NonEmptyString;
|
|
26
|
+
readonly status: Schema.Literals<readonly ["creating", "created", "updating", "updated", "deleting", "replacing", "replaced"]>;
|
|
27
|
+
readonly parent: Schema.NullOr<Schema.String>;
|
|
28
|
+
readonly providerId: Schema.NullOr<Schema.String>;
|
|
29
|
+
readonly account: Schema.NullOr<Schema.String>;
|
|
30
|
+
readonly region: Schema.NullOr<Schema.String>;
|
|
31
|
+
readonly consoleUrl: Schema.NullOr<Schema.String>;
|
|
32
|
+
}>>;
|
|
33
|
+
}>;
|
|
34
|
+
export interface StackState extends Schema.Schema.Type<typeof StackState> {
|
|
35
|
+
}
|
|
36
|
+
declare const StateReadError_base: Schema.Class<StateReadError, Schema.TaggedStruct<"StateReadError", {
|
|
37
|
+
readonly reason: Schema.Literals<readonly ["io", "invalid-state", "invalid-lockfile", "unsupported-version", "limit", "outside-root"]>;
|
|
38
|
+
}>, import("effect/Cause").YieldableError>;
|
|
39
|
+
/** Contains no source input, parser diagnostics, provider locators, or underlying filesystem errors. */
|
|
40
|
+
export declare class StateReadError extends StateReadError_base {
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,eAAO,MAAM,eAAe;;;;;;;;;;EAU1B,CAAA;AACF,MAAM,WAAW,eAAgB,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,eAAe,CAAC;CAAG;AAEtF,4GAA4G;AAC5G,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;EAOrB,CAAA;AACF,MAAM,WAAW,UAAW,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC;CAAG;;;;AAE5E,wGAAwG;AACxG,qBAAa,cAAe,SAAQ,mBAElC;CAAG"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
export const ResourceSummary = Schema.Struct({
|
|
3
|
+
fqn: Schema.NonEmptyString,
|
|
4
|
+
logicalId: Schema.NonEmptyString,
|
|
5
|
+
resourceType: Schema.NonEmptyString,
|
|
6
|
+
status: Schema.Literals(["creating", "created", "updating", "updated", "deleting", "replacing", "replaced"]),
|
|
7
|
+
parent: Schema.NullOr(Schema.String),
|
|
8
|
+
providerId: Schema.NullOr(Schema.String),
|
|
9
|
+
account: Schema.NullOr(Schema.String),
|
|
10
|
+
region: Schema.NullOr(Schema.String),
|
|
11
|
+
consoleUrl: Schema.NullOr(Schema.String)
|
|
12
|
+
});
|
|
13
|
+
/** Safe metadata for an authenticated owner. Never includes state paths, props, outputs, or credentials. */
|
|
14
|
+
export const StackState = Schema.Struct({
|
|
15
|
+
app: Schema.NonEmptyString,
|
|
16
|
+
stage: Schema.NonEmptyString,
|
|
17
|
+
backend: Schema.Literals(["local", "s3"]),
|
|
18
|
+
alchemyVersion: Schema.NullOr(Schema.String),
|
|
19
|
+
lastDeploy: Schema.NullOr(Schema.String),
|
|
20
|
+
resources: Schema.Array(ResourceSummary)
|
|
21
|
+
});
|
|
22
|
+
/** Contains no source input, parser diagnostics, provider locators, or underlying filesystem errors. */
|
|
23
|
+
export class StateReadError extends Schema.TaggedError()("StateReadError", {
|
|
24
|
+
reason: Schema.Literals(["io", "invalid-state", "invalid-lockfile", "unsupported-version", "limit", "outside-root"])
|
|
25
|
+
}) {
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC,cAAc;IAC1B,SAAS,EAAE,MAAM,CAAC,cAAc;IAChC,YAAY,EAAE,MAAM,CAAC,cAAc;IACnC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC5G,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;CACzC,CAAC,CAAA;AAGF,4GAA4G;AAC5G,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,GAAG,EAAE,MAAM,CAAC,cAAc;IAC1B,KAAK,EAAE,MAAM,CAAC,cAAc;IAC5B,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;CACzC,CAAC,CAAA;AAGF,wGAAwG;AACxG,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,WAAW,EAAkB,CAAC,gBAAgB,EAAE;IACzF,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;CACrH,CAAC;CAAG"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Layer, Path } from "effect";
|
|
2
|
+
import { HttpRouter } from "effect/http";
|
|
3
|
+
export declare const BootstrapRoutes: Layer.Layer<never, import("effect/PlatformError").BadArgument | import("effect/PlatformError").PlatformError, import("effect/FileSystem").FileSystem | import("effect/http/HttpPlatform").HttpPlatform | HttpRouter.HttpRouter | Path.Path>;
|
|
4
|
+
//# sourceMappingURL=Bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Bootstrap.d.ts","sourceRoot":"","sources":["../../src/server/Bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAwC,MAAM,aAAa,CAAA;AAM9E,eAAO,MAAM,eAAe,6OAU3B,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect, Layer, Path } from "effect";
|
|
2
|
+
import { HttpRouter, HttpServerResponse, HttpStaticServer } from "effect/http";
|
|
3
|
+
/** Auth handoff only. The design-backed stack UI will replace the JSON navigation in a later PR. */
|
|
4
|
+
const document = `<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>Alchemy console</title><body><main><p id="status">Signing in…</p><noscript>Enable JavaScript to sign in.</noscript></main><script type="module" src="/bootstrap.js"></script></body></html>`;
|
|
5
|
+
export const BootstrapRoutes = Layer.mergeAll(HttpRouter.add("GET", "/", HttpServerResponse.html(document)), HttpRouter.add("GET", "/favicon.ico", HttpServerResponse.empty({ status: 204 })), Layer.unwrap(Effect.gen(function* () {
|
|
6
|
+
const path = yield* Path.Path;
|
|
7
|
+
return HttpStaticServer.layer({
|
|
8
|
+
root: yield* path.fromFileUrl(new URL("../../dist/client", import.meta.url)),
|
|
9
|
+
cacheControl: "no-store"
|
|
10
|
+
});
|
|
11
|
+
})));
|
|
12
|
+
//# sourceMappingURL=Bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Bootstrap.js","sourceRoot":"","sources":["../../src/server/Bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9E,oGAAoG;AACpG,MAAM,QAAQ,GACZ,4SAA4S,CAAA;AAE9S,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAC3C,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAC7D,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAChF,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,OAAO,gBAAgB,CAAC,KAAK,CAAC;QAC5B,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,mBAAmB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5E,YAAY,EAAE,UAAU;KACzB,CAAC,CAAA;AACJ,CAAC,CAAC,CAAC,CACJ,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Context, Crypto, Effect, Layer } from "effect";
|
|
2
|
+
import { CatalogReadError, StackNotFound, StackSummary } from "../api.js";
|
|
3
|
+
import type { DiscoveryIssue, StackDetail, StackId, StackList } from "../api.js";
|
|
4
|
+
import { type StackState } from "../schema.js";
|
|
5
|
+
/** Server-private locator identity and read closure. Never serialize or retain in logs or browser storage. */
|
|
6
|
+
export interface DiscoveredStack {
|
|
7
|
+
readonly key: string;
|
|
8
|
+
readonly summary: Omit<StackSummary, "id">;
|
|
9
|
+
readonly read: Effect.Effect<StackState, CatalogReadError>;
|
|
10
|
+
}
|
|
11
|
+
declare const StackSource_base: Context.ServiceClass<StackSource, "@knpkv/alchemy-console/StackSource", {
|
|
12
|
+
readonly discover: Effect.Effect<{
|
|
13
|
+
readonly stacks: ReadonlyArray<DiscoveredStack>;
|
|
14
|
+
readonly issues: ReadonlyArray<DiscoveryIssue>;
|
|
15
|
+
}, CatalogReadError>;
|
|
16
|
+
}>;
|
|
17
|
+
export declare class StackSource extends StackSource_base {
|
|
18
|
+
}
|
|
19
|
+
declare const Catalog_base: Context.ServiceClass<Catalog, "@knpkv/alchemy-console/Catalog", {
|
|
20
|
+
readonly list: Effect.Effect<StackList, CatalogReadError>;
|
|
21
|
+
readonly get: (id: StackId) => Effect.Effect<StackDetail, StackNotFound | CatalogReadError>;
|
|
22
|
+
}>;
|
|
23
|
+
export declare class Catalog extends Catalog_base {
|
|
24
|
+
static readonly layer: Layer.Layer<Catalog, never, Crypto.Crypto | StackSource>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=Catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Catalog.d.ts","sourceRoot":"","sources":["../../src/server/Catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAA0B,MAAM,QAAQ,CAAA;AAC/E,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAChF,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAEpE,8GAA8G;AAC9G,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAA;CAC3D;;uBAGoB,MAAM,CAAC,MAAM,CAAC;QAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;QAC/C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;KAC/C,EAAE,gBAAgB,CAAC;;AAJtB,qBAAa,WAAY,SAAQ,gBAKS;CAAG;;mBAG5B,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC;kBAC3C,CAAC,EAAE,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,GAAG,gBAAgB,CAAC;;AAF7F,qBAAa,OAAQ,SAAQ,YAGS;IACpC,MAAM,CAAC,QAAQ,CAAC,KAAK,2DAqEpB;CACF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Context, Crypto, Effect, Layer, Ref, Schema, Semaphore } from "effect";
|
|
2
|
+
import { CatalogReadError, StackNotFound, StackSummary } from "../api.js";
|
|
3
|
+
import {} from "../schema.js";
|
|
4
|
+
export class StackSource extends Context.Service()("@knpkv/alchemy-console/StackSource") {
|
|
5
|
+
}
|
|
6
|
+
export class Catalog extends Context.Service()("@knpkv/alchemy-console/Catalog") {
|
|
7
|
+
static layer = Layer.effect(Catalog, Effect.gen(function* () {
|
|
8
|
+
const source = yield* StackSource;
|
|
9
|
+
const cryptoService = yield* Crypto.Crypto;
|
|
10
|
+
const entries = yield* Ref.make(new Map());
|
|
11
|
+
const lock = yield* Semaphore.make(1);
|
|
12
|
+
const list = Effect.fn("AlchemyConsole.catalogList")(function* () {
|
|
13
|
+
const discovered = yield* source.discover;
|
|
14
|
+
if (discovered.stacks.length > 1000 || discovered.issues.length > 1000) {
|
|
15
|
+
return yield* new CatalogReadError({ reason: "limit" });
|
|
16
|
+
}
|
|
17
|
+
const current = yield* Ref.get(entries);
|
|
18
|
+
const previous = new Map([...current].map(([id, entry]) => [entry.key, id]));
|
|
19
|
+
const next = new Map();
|
|
20
|
+
const keys = new Set();
|
|
21
|
+
const summaries = [];
|
|
22
|
+
for (const entry of discovered.stacks) {
|
|
23
|
+
if (keys.has(entry.key))
|
|
24
|
+
return yield* new CatalogReadError({ reason: "invalid-source" });
|
|
25
|
+
keys.add(entry.key);
|
|
26
|
+
const id = previous.get(entry.key) ?? (yield* cryptoService.randomUUIDv4.pipe(Effect.mapError(() => new CatalogReadError({ reason: "io" }))));
|
|
27
|
+
const summary = yield* Schema.decodeUnknownEffect(StackSummary)({
|
|
28
|
+
id,
|
|
29
|
+
app: entry.summary.app,
|
|
30
|
+
stage: entry.summary.stage,
|
|
31
|
+
backend: entry.summary.backend,
|
|
32
|
+
alchemyVersion: entry.summary.alchemyVersion,
|
|
33
|
+
lastDeploy: entry.summary.lastDeploy,
|
|
34
|
+
resourceCount: entry.summary.resourceCount
|
|
35
|
+
}).pipe(Effect.mapError(() => new CatalogReadError({ reason: "invalid-source" })));
|
|
36
|
+
next.set(id, entry);
|
|
37
|
+
summaries.push(summary);
|
|
38
|
+
}
|
|
39
|
+
const issues = discovered.issues.map((issue) => ({ source: issue.source, reason: issue.reason }));
|
|
40
|
+
yield* Ref.set(entries, next);
|
|
41
|
+
return { stacks: summaries, issues };
|
|
42
|
+
}, lock.withPermit, Effect.timeoutOrElse({
|
|
43
|
+
duration: "2 minutes",
|
|
44
|
+
orElse: () => Effect.fail(new CatalogReadError({ reason: "limit" }))
|
|
45
|
+
}));
|
|
46
|
+
const get = Effect.fn("AlchemyConsole.catalogGet")(function* (id) {
|
|
47
|
+
const entry = (yield* Ref.get(entries)).get(id);
|
|
48
|
+
if (entry === undefined)
|
|
49
|
+
return yield* new StackNotFound({});
|
|
50
|
+
const state = yield* entry.read;
|
|
51
|
+
if (state.app !== entry.summary.app || state.stage !== entry.summary.stage ||
|
|
52
|
+
state.backend !== entry.summary.backend)
|
|
53
|
+
return yield* new CatalogReadError({ reason: "invalid-source" });
|
|
54
|
+
if (state.resources.length > 50_000)
|
|
55
|
+
return yield* new CatalogReadError({ reason: "limit" });
|
|
56
|
+
return {
|
|
57
|
+
id,
|
|
58
|
+
state: {
|
|
59
|
+
app: state.app,
|
|
60
|
+
stage: state.stage,
|
|
61
|
+
backend: state.backend,
|
|
62
|
+
alchemyVersion: state.alchemyVersion,
|
|
63
|
+
lastDeploy: state.lastDeploy,
|
|
64
|
+
resources: state.resources.map(publicResource)
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
return Catalog.of({ list: list(), get });
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
/** Explicit projection prevents a private reader's extra fields from reaching a transport encoder. */
|
|
72
|
+
const publicResource = (resource) => ({
|
|
73
|
+
fqn: resource.fqn,
|
|
74
|
+
logicalId: resource.logicalId,
|
|
75
|
+
resourceType: resource.resourceType,
|
|
76
|
+
status: resource.status,
|
|
77
|
+
parent: resource.parent,
|
|
78
|
+
providerId: resource.providerId,
|
|
79
|
+
account: resource.account,
|
|
80
|
+
region: resource.region,
|
|
81
|
+
consoleUrl: resource.consoleUrl
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=Catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Catalog.js","sourceRoot":"","sources":["../../src/server/Catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Config, Effect, Path, Schema } from "effect";
|
|
2
|
+
export declare const Port: Schema.Int;
|
|
3
|
+
declare const StartupError_base: Schema.Class<StartupError, Schema.TaggedStruct<"StartupError", {
|
|
4
|
+
readonly reason: Schema.Literals<readonly ["config", "invalid-port", "package"]>;
|
|
5
|
+
}>, import("effect/Cause").YieldableError>;
|
|
6
|
+
export declare class StartupError extends StartupError_base {
|
|
7
|
+
}
|
|
8
|
+
/** Resolve the manifest beside the built executable; release version edits need no source change. */
|
|
9
|
+
export declare const readPackageVersion: () => Effect.Effect<string, StartupError, import("effect/FileSystem").FileSystem | Path.Path>;
|
|
10
|
+
/** Read paths once at executable startup. None of this configuration crosses HTTP or browser storage. */
|
|
11
|
+
export declare const loadConfig: (home: string) => Effect.Effect<{
|
|
12
|
+
root: string;
|
|
13
|
+
awsConfigFile: string;
|
|
14
|
+
directory: string;
|
|
15
|
+
}, Config.ConfigError, Path.Path>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=Config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/server/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGrD,eAAO,MAAM,IAAI,YAAwE,CAAA;;;;AAEzF,qBAAa,YAAa,SAAQ,iBAEhC;CAAG;AAEL,qGAAqG;AACrG,eAAO,MAAM,kBAAkB,+FAY7B,CAAA;AAEF,yGAAyG;AACzG,eAAO,MAAM,UAAU;;;;iCASrB,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Config, Effect, Path, Schema } from "effect";
|
|
2
|
+
import { readText } from "../internal/files.js";
|
|
3
|
+
export const Port = Schema.Int.check(Schema.isBetween({ minimum: 1024, maximum: 65535 }));
|
|
4
|
+
export class StartupError extends Schema.TaggedError()("StartupError", {
|
|
5
|
+
reason: Schema.Literals(["config", "invalid-port", "package"])
|
|
6
|
+
}) {
|
|
7
|
+
}
|
|
8
|
+
/** Resolve the manifest beside the built executable; release version edits need no source change. */
|
|
9
|
+
export const readPackageVersion = Effect.fn("AlchemyConsole.readPackageVersion")(function* () {
|
|
10
|
+
const path = yield* Path.Path;
|
|
11
|
+
const file = yield* path.fromFileUrl(new URL("../../package.json", import.meta.url)).pipe(Effect.mapError(() => new StartupError({ reason: "package" })));
|
|
12
|
+
return yield* readText(file).pipe(Effect.flatMap(Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ version: Schema.NonEmptyString })))), Effect.map(({ version }) => version), Effect.mapError(() => new StartupError({ reason: "package" })));
|
|
13
|
+
});
|
|
14
|
+
/** Read paths once at executable startup. None of this configuration crosses HTTP or browser storage. */
|
|
15
|
+
export const loadConfig = Effect.fn("AlchemyConsole.loadConfig")(function* (home) {
|
|
16
|
+
const path = yield* Path.Path;
|
|
17
|
+
return {
|
|
18
|
+
root: yield* Config.String("ALCHEMY_CONSOLE_ROOT").pipe(Config.withDefault(path.join(home, "Work", "dev"))),
|
|
19
|
+
awsConfigFile: yield* Config.String("AWS_CONFIG_FILE").pipe(Config.withDefault(path.join(home, ".aws", "config"))),
|
|
20
|
+
directory: yield* Config.String("ALCHEMY_CONSOLE_HOME").pipe(Config.withDefault(path.join(home, ".cache", "alchemy-console")))
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=Config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/server/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;AAEzF,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,WAAW,EAAgB,CAAC,cAAc,EAAE;IACnF,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;CAC/D,CAAC;CAAG;AAEL,qGAAqG;AACrG,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC;IACxF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CACvF,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAC/D,CAAA;IACD,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAC/B,MAAM,CAAC,OAAO,CACZ,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CACrG,EACD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EACpC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAC/D,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,yGAAyG;AACzG,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EAAC,IAAY;IACrF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3G,aAAa,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClH,SAAS,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAC1D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CACjE;KACF,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { OwnerSessionService } from "@knpkv/browser-pairing/owner-session";
|
|
2
|
+
import { Effect, FileSystem, Option, Path, Schema } from "effect";
|
|
3
|
+
declare const ControlError_base: Schema.Class<ControlError, Schema.TaggedStruct<"ControlError", {
|
|
4
|
+
readonly reason: Schema.Literals<readonly ["unsafe", "io", "occupied", "path-limit", "invalid-reply", "timeout", "unsupported-platform"]>;
|
|
5
|
+
}>, import("effect/Cause").YieldableError>;
|
|
6
|
+
export declare class ControlError extends ControlError_base {
|
|
7
|
+
}
|
|
8
|
+
/** Paths are server-private. The effective UID is read once at the executable boundary. */
|
|
9
|
+
export interface ControlOptions {
|
|
10
|
+
readonly directory: string;
|
|
11
|
+
readonly port: number;
|
|
12
|
+
readonly uid: number;
|
|
13
|
+
}
|
|
14
|
+
/** Bind atomically; refuse all pre-existing entries. Never unlink a possibly live server during startup. */
|
|
15
|
+
export declare const controlSocket: (options: ControlOptions, session: OwnerSessionService, listening: Effect.Effect<void, never, never>) => Effect.Effect<undefined, ControlError, FileSystem.FileSystem | Path.Path | import("effect/Scope").Scope>;
|
|
16
|
+
/** None means no socket exists. Unsafe paths, stale sockets and bad replies propagate without starting another server. */
|
|
17
|
+
export declare const requestLoginUrl: (options: ControlOptions) => Effect.Effect<Option.Option<string>, ControlError, FileSystem.FileSystem | Path.Path>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=ControlSocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlSocket.d.ts","sourceRoot":"","sources":["../../src/server/ControlSocket.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAC/E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAA;;;;AAKjF,qBAAa,YAAa,SAAQ,iBAUhC;CAAG;AAEL,2FAA2F;AAC3F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AA6ED,4GAA4G;AAC5G,eAAO,MAAM,aAAa,mNA4CxB,CAAA;AAMF,0HAA0H;AAC1H,eAAO,MAAM,eAAe,oHA0B1B,CAAA"}
|