@knpkv/alchemy-console 0.0.0-stage → 0.1.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +118 -2
  3. package/dist/discovery.d.ts +12 -0
  4. package/dist/discovery.d.ts.map +1 -0
  5. package/dist/discovery.js +39 -0
  6. package/dist/discovery.js.map +1 -0
  7. package/dist/index.d.ts +14 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +11 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/internal/files.d.ts +9 -0
  12. package/dist/internal/files.d.ts.map +1 -0
  13. package/dist/internal/files.js +34 -0
  14. package/dist/internal/files.js.map +1 -0
  15. package/dist/local-state.d.ts +8 -0
  16. package/dist/local-state.d.ts.map +1 -0
  17. package/dist/local-state.js +53 -0
  18. package/dist/local-state.js.map +1 -0
  19. package/dist/profiles.d.ts +24 -0
  20. package/dist/profiles.d.ts.map +1 -0
  21. package/dist/profiles.js +82 -0
  22. package/dist/profiles.js.map +1 -0
  23. package/dist/s3-live.d.ts +8 -0
  24. package/dist/s3-live.d.ts.map +1 -0
  25. package/dist/s3-live.js +111 -0
  26. package/dist/s3-live.js.map +1 -0
  27. package/dist/s3-reader.d.ts +46 -0
  28. package/dist/s3-reader.d.ts.map +1 -0
  29. package/dist/s3-reader.js +10 -0
  30. package/dist/s3-reader.js.map +1 -0
  31. package/dist/s3-state.d.ts +21 -0
  32. package/dist/s3-state.d.ts.map +1 -0
  33. package/dist/s3-state.js +129 -0
  34. package/dist/s3-state.js.map +1 -0
  35. package/dist/schema.d.ts +43 -0
  36. package/dist/schema.d.ts.map +1 -0
  37. package/dist/schema.js +27 -0
  38. package/dist/schema.js.map +1 -0
  39. package/dist/sso-credentials.d.ts +17 -0
  40. package/dist/sso-credentials.d.ts.map +1 -0
  41. package/dist/sso-credentials.js +43 -0
  42. package/dist/sso-credentials.js.map +1 -0
  43. package/dist/state.d.ts +15 -0
  44. package/dist/state.d.ts.map +1 -0
  45. package/dist/state.js +45 -0
  46. package/dist/state.js.map +1 -0
  47. package/dist/version.d.ts +5 -0
  48. package/dist/version.d.ts.map +1 -0
  49. package/dist/version.js +61 -0
  50. package/dist/version.js.map +1 -0
  51. package/package.json +49 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-live.js","sourceRoot":"","sources":["../src/s3-live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AACpD,OAAO,EAEL,SAAS,EAET,WAAW,EAGX,kBAAkB,EAGnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAiB,QAAQ,EAAE,WAAW,EAAsC,MAAM,gBAAgB,CAAA;AACzG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAI3C,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAe,EAAE;IAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,KAAK,CAAA;IAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;IAC1E,IAAI,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,uBAAuB,EAAE,CAAC;QAC9D,OAAO,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9C,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IACjH,IACE,CAAC,cAAc,EAAE,uBAAuB,EAAE,cAAc,EAAE,oBAAoB,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAC/G,GAAG,CACJ,EACD,CAAC;QACD,OAAO,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAA;IACtD,CAAC;IACD,OAAO,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,qGAAqG;AACrG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAmB,EAAE,EAAE,CACnD,KAAK,CAAC,MAAM,CACV,QAAQ,EACR,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAA;IAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EACvD,MAAgE,EAChE,MAAc;QAEd,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAC/D,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EACrD,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC;QACpD,2EAA2E;QAC3E,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAChE,MAAM,CAAC,aAAa,CAAC;YACnB,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;SACnE,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAC/B,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAC,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,8BAA8B,CAAC,CAAC,QAAQ,CAAC,EAAC,MAAqB;YAChF,MAAM,OAAO,GAAuB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;YACxD,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,CAAC,iBAAiB,GAAG,MAAM,CAAA;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;YAC9D,MAAM,OAAO,GAAoB,EAAE,CAAA;YACnC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBACxC,IACE,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;oBAC1F,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;oBAChC,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAA;gBAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAA;YAClE,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE,CAAA;QAC1D,CAAC,CAAC;QACF,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,QAAQ,CAAC,EAC5D,MAAgB,EAChB,MAAc,EACd,MAA4B;YAE5B,MAAM,OAAO,GAA8B;gBACzC,MAAM,EAAE,MAAM,CAAC,IAAI;gBACnB,mBAAmB,EAAE,OAAO,CAAC,OAAO;gBACpC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI;aACd,CAAA;YACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAA;gBAC9B,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;oBAAE,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,SAAS,CAAA;YAC3E,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;YACpE,MAAM,QAAQ,GAAqB,EAAE,CAAA;YACrC,MAAM,MAAM,GAAgF;gBAC1F,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC7C,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;aAClD,CAAA;YACD,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;gBACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IACE,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;wBAC5E,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EACxD,CAAC;wBACD,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAA;oBAC/D,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;gBAC1F,CAAC;YACH,CAAC;YACD,IACE,IAAI,CAAC,WAAW,KAAK,SAAS;gBAC9B,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,EAC3F,CAAC;gBACD,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC/D,CAAC;YACD,OAAO;gBACL,QAAQ;gBACR,IAAI,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;oBAC/B;wBACE,GAAG,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE;wBAC7B,SAAS,EAAE,IAAI,CAAC,mBAAmB,IAAI,IAAI;qBAC5C,CAAC,CAAC;oBACH,IAAI;aACP,CAAA;QACH,CAAC,CAAC;QACF,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,8BAA8B,CAAC,CACjD,QAAQ,CAAC,EAAC,MAAgB,EAAE,GAAW,EAAE,SAAiB;YACxD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CACxB,SAAS,CAAC;gBACR,MAAM,EAAE,MAAM,CAAC,IAAI;gBACnB,mBAAmB,EAAE,OAAO,CAAC,OAAO;gBACpC,GAAG,EAAE,GAAG;gBACR,SAAS,EAAE,SAAS;aACrB,CAAC,EACF,MAAM,CAAC,MAAM,CACd,CAAA;YACD,IACE,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EACvG,CAAC;gBACD,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC/D,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CACvE,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CACnG,EACD,MAAM,CAAC,aAAa,CAAC;gBACnB,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;aACnE,CAAC,CACH,CAAA;YACD,OAAO,KAAK,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QACpC,CAAC,CACF;KACF,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CAAA"}
@@ -0,0 +1,46 @@
1
+ import type { Effect } from "effect";
2
+ import { Context, Schema } from "effect";
3
+ import type { ResourceSummary, StateReadError } from "./schema.js";
4
+ /** Server-private bucket name and routing region; memory only, never HTTP, browser storage, logs or telemetry. */
5
+ export interface S3Bucket {
6
+ readonly name: string;
7
+ readonly region: string;
8
+ }
9
+ /** Server-private S3 pagination coordinates with the same boundary as bucket/key/version locators. */
10
+ export interface VersionCursor {
11
+ readonly key: string;
12
+ readonly versionId: string | null;
13
+ }
14
+ /** Server-private persisted S3 key/version coordinates. Only normalized resource metadata may leave the server. */
15
+ export interface S3Version {
16
+ readonly key: string;
17
+ readonly versionId: string;
18
+ readonly latest: boolean;
19
+ readonly deleted: boolean;
20
+ }
21
+ /** Server-private bucket listing and opaque continuation token. */
22
+ export interface S3BucketPage {
23
+ readonly buckets: ReadonlyArray<S3Bucket>;
24
+ readonly next: string | null;
25
+ }
26
+ /** Server-private version listing and continuation coordinates. */
27
+ export interface S3VersionPage {
28
+ readonly versions: ReadonlyArray<S3Version>;
29
+ readonly next: VersionCursor | null;
30
+ }
31
+ declare const S3ReadError_base: Schema.Class<S3ReadError, Schema.TaggedStruct<"S3ReadError", {
32
+ readonly reason: Schema.Literals<readonly ["authentication", "denied", "not-found", "provider", "invalid-response", "limit"]>;
33
+ }>, import("effect/Cause").YieldableError>;
34
+ /** No raw provider error, credentials or locator is retained. */
35
+ export declare class S3ReadError extends S3ReadError_base {
36
+ }
37
+ declare const S3Reader_base: Context.ServiceClass<S3Reader, "@knpkv/alchemy-console/S3Reader", {
38
+ readonly buckets: (cursor: string | null) => Effect.Effect<S3BucketPage, S3ReadError>;
39
+ readonly versions: (bucket: S3Bucket, prefix: string, cursor: VersionCursor | null) => Effect.Effect<S3VersionPage, S3ReadError>;
40
+ readonly resource: (bucket: S3Bucket, key: string, versionId: string) => Effect.Effect<ResourceSummary | null, S3ReadError | StateReadError>;
41
+ }>;
42
+ /** Bound to one explicit SSO profile. No writes, Alchemy runtime, credential chain or implicit login. */
43
+ export declare class S3Reader extends S3Reader_base {
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=s3-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-reader.d.ts","sourceRoot":"","sources":["../src/s3-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAElE,kHAAkH;AAClH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,sGAAsG;AACtG,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AAED,mHAAmH;AACnH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,mEAAmE;AACnE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAC3C,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAA;CACpC;;;;AAED,iEAAiE;AACjE,qBAAa,WAAY,SAAQ,gBAE/B;CAAG;;sBAIe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC;uBAClE,CACjB,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,GAAG,IAAI,KACzB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC;uBAC3B,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CACpF,eAAe,GAAG,IAAI,EACtB,WAAW,GAAG,cAAc,CAC7B;;AAXH,yGAAyG;AACzG,qBAAa,QAAS,SAAQ,aAWS;CAAG"}
@@ -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"}
@@ -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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"}
@@ -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,17 @@
1
+ import { fromSSO } from "@aws-sdk/credential-provider-sso";
2
+ import type { ResolvedCredentials } from "@distilled.cloud/aws/Credentials";
3
+ import { Context, Effect, Layer } from "effect";
4
+ import type { SsoProfile } from "./profiles.js";
5
+ import { S3ReadError } from "./s3-reader.js";
6
+ declare const SsoCredentials_base: Context.ServiceClass<SsoCredentials, "@knpkv/alchemy-console/SsoCredentials", {
7
+ readonly resolve: (profile: SsoProfile) => Effect.Effect<ResolvedCredentials, S3ReadError>;
8
+ }>;
9
+ /** Credential-bearing service; results go only to server-side signing and never to persistence, HTTP or logs. */
10
+ export declare class SsoCredentials extends SsoCredentials_base {
11
+ }
12
+ /** SDK factory returns credential-bearing material; inject it at this signing boundary for tests. */
13
+ export type SsoCredentialProviderFactory = typeof fromSSO;
14
+ /** Use only an explicit SSO provider; never a default credential chain. */
15
+ export declare const ssoCredentialsLayer: (provider?: SsoCredentialProviderFactory) => Layer.Layer<SsoCredentials, never, never>;
16
+ export {};
17
+ //# sourceMappingURL=sso-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-credentials.d.ts","sourceRoot":"","sources":["../src/sso-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmD,MAAM,kCAAkC,CAAA;AAC3G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAoB,MAAM,QAAQ,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;;sBAUxB,CAAC,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,WAAW,CAAC;;AAF5F,iHAAiH;AACjH,qBAAa,cAAe,SAAQ,mBAES;CAAG;AAEhD,qGAAqG;AACrG,MAAM,MAAM,4BAA4B,GAAG,OAAO,OAAO,CAAA;AAEzD,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,cAAc,4BAA4B,8CA+BtE,CAAA"}
@@ -0,0 +1,43 @@
1
+ import { fromSSO } from "@aws-sdk/credential-provider-sso";
2
+ import { Context, Effect, Layer, Redacted, Schema } from "effect";
3
+ import { S3ReadError } from "./s3-reader.js";
4
+ const CredentialIdentity = Schema.Struct({
5
+ accessKeyId: Schema.NonEmptyString,
6
+ secretAccessKey: Schema.NonEmptyString,
7
+ sessionToken: Schema.NonEmptyString
8
+ });
9
+ /** Credential-bearing service; results go only to server-side signing and never to persistence, HTTP or logs. */
10
+ export class SsoCredentials extends Context.Service()("@knpkv/alchemy-console/SsoCredentials") {
11
+ }
12
+ /** Use only an explicit SSO provider; never a default credential chain. */
13
+ export const ssoCredentialsLayer = (provider = fromSSO) => Layer.succeed(SsoCredentials, {
14
+ resolve: Effect.fn("AlchemyConsole.resolveSsoCredentials")(function* (profile) {
15
+ const request = {
16
+ profile: profile.name,
17
+ configFilepath: profile.configFile,
18
+ ssoAccountId: profile.account,
19
+ ssoRoleName: profile.role,
20
+ ssoRegion: profile.ssoRegion,
21
+ ssoStartUrl: profile.startUrl,
22
+ clientConfig: { region: profile.ssoRegion },
23
+ ignoreCache: true
24
+ };
25
+ if (profile.session !== null)
26
+ request.ssoSession = profile.session;
27
+ const raw = yield* Effect.tryPromise({
28
+ try: () => provider(request)(),
29
+ catch: () => new S3ReadError({ reason: "authentication" })
30
+ }).pipe(Effect.timeoutOrElse({
31
+ duration: "15 seconds",
32
+ orElse: () => Effect.fail(new S3ReadError({ reason: "authentication" }))
33
+ }));
34
+ const identity = yield* Schema.decodeUnknownEffect(CredentialIdentity)(raw).pipe(Effect.mapError(() => new S3ReadError({ reason: "authentication" })));
35
+ return {
36
+ accessKeyId: Redacted.make(identity.accessKeyId),
37
+ secretAccessKey: Redacted.make(identity.secretAccessKey),
38
+ sessionToken: Redacted.make(identity.sessionToken),
39
+ region: profile.region
40
+ };
41
+ })
42
+ });
43
+ //# sourceMappingURL=sso-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-credentials.js","sourceRoot":"","sources":["../src/sso-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmD,MAAM,kCAAkC,CAAA;AAE3G,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC,cAAc;IAClC,eAAe,EAAE,MAAM,CAAC,cAAc;IACtC,YAAY,EAAE,MAAM,CAAC,cAAc;CACpC,CAAC,CAAA;AAEF,iHAAiH;AACjH,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,OAAO,EAE/C,CAAC,uCAAuC,CAAC;CAAG;AAKhD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,GAAiC,OAAO,EAAE,EAAE,CACtF,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE;IAC5B,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,sCAAsC,CAAC,CAAC,QAAQ,CAAC,EAAC,OAAmB;QACtF,MAAM,OAAO,GAA2C;YACtD,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,cAAc,EAAE,OAAO,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,CAAC,OAAO;YAC7B,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,OAAO,CAAC,QAAQ;YAC7B,YAAY,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;YAC3C,WAAW,EAAE,IAAI;SAClB,CAAA;QACD,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAA;QAClE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;YACnC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC9B,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;SAC3D,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3B,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;SACzE,CAAC,CAAC,CAAA;QACH,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAC9E,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CACrE,CAAA;QACD,OAAO;YACL,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;YAChD,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;YACxD,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;YAClD,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAA;IACH,CAAC,CAAC;CACH,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { Effect } from "effect";
2
+ import { StateReadError } from "./schema.js";
3
+ /** Decode persisted beta.74/beta.77 JSON into metadata; action rows are validated and excluded. */
4
+ export declare const decodeResource: (text: string) => Effect.Effect<{
5
+ readonly fqn: string;
6
+ readonly logicalId: string;
7
+ readonly resourceType: string;
8
+ readonly status: "created" | "creating" | "deleting" | "replaced" | "replacing" | "updated" | "updating";
9
+ readonly parent: string | null;
10
+ readonly providerId: string | null;
11
+ readonly account: string | null;
12
+ readonly region: string | null;
13
+ readonly consoleUrl: string | null;
14
+ } | null, StateReadError, never>;
15
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,QAAQ,CAAA;AAClD,OAAO,EAAmB,cAAc,EAAE,MAAM,aAAa,CAAA;AA6B7D,mGAAmG;AACnG,eAAO,MAAM,cAAc;;;;;;;;;;gCAoBzB,CAAA"}
package/dist/state.js ADDED
@@ -0,0 +1,45 @@
1
+ import { Effect, Predicate, Schema } from "effect";
2
+ import { ResourceSummary, StateReadError } from "./schema.js";
3
+ const ResourceRow = Schema.Struct({
4
+ kind: Schema.optionalKey(Schema.Literal("resource")),
5
+ fqn: Schema.NonEmptyString,
6
+ logicalId: Schema.NonEmptyString,
7
+ resourceType: Schema.NonEmptyString,
8
+ status: ResourceSummary.fields.status
9
+ });
10
+ const ActionRow = Schema.Struct({
11
+ kind: Schema.Literal("action"),
12
+ fqn: Schema.NonEmptyString,
13
+ logicalId: Schema.NonEmptyString,
14
+ actionType: Schema.NonEmptyString,
15
+ status: Schema.Literals(["running", "ran"])
16
+ });
17
+ const metadataKeys = ["kind", "fqn", "logicalId", "resourceType", "actionType", "status"];
18
+ /** Discard properties and outputs entirely. Mask marker objects in metadata, including their siblings. */
19
+ const metadata = (value) => {
20
+ if (Object.hasOwn(value, "__redacted__"))
21
+ return null;
22
+ return Object.fromEntries(Object.entries(value).filter(([key]) => metadataKeys.includes(key)).map(([key, field]) => {
23
+ return [key, Predicate.isObject(field) && Object.hasOwn(field, "__redacted__") ? "<redacted>" : field];
24
+ }));
25
+ };
26
+ /** Decode persisted beta.74/beta.77 JSON into metadata; action rows are validated and excluded. */
27
+ export const decodeResource = Effect.fn("AlchemyConsole.decodeResource")(function* (text) {
28
+ const json = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.JsonObject))(text).pipe(Effect.mapError(() => new StateReadError({ reason: "invalid-state" })));
29
+ const row = yield* Schema.decodeUnknownEffect(Schema.Union([ResourceRow, ActionRow]))(metadata(json)).pipe(Effect.mapError(() => new StateReadError({ reason: "invalid-state" })));
30
+ if (row.kind === "action")
31
+ return null;
32
+ const slash = row.fqn.lastIndexOf("/");
33
+ return ResourceSummary.make({
34
+ fqn: row.fqn,
35
+ logicalId: row.logicalId,
36
+ resourceType: row.resourceType,
37
+ status: row.status,
38
+ parent: slash === -1 ? null : row.fqn.slice(0, slash),
39
+ providerId: null,
40
+ account: null,
41
+ region: null,
42
+ consoleUrl: null
43
+ });
44
+ });
45
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Effect, FileSystem, Path } from "effect";
2
+ import { StateReadError } from "./schema.js";
3
+ /** Read the nearest pnpm or Bun text lockfile within an explicit server-private search root. */
4
+ export declare const readAlchemyVersion: (projectDirectory: string, searchRoot: string) => Effect.Effect<string | null, StateReadError, FileSystem.FileSystem | Path.Path>;
5
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAU,MAAM,QAAQ,CAAA;AAIzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AA4C5C,gGAAgG;AAChG,eAAO,MAAM,kBAAkB,mIAqB7B,CAAA"}
@@ -0,0 +1,61 @@
1
+ import { Effect, FileSystem, Path, Schema } from "effect";
2
+ import { parse as parseJsonc } from "jsonc-parser";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { exists, readText, withinRoot } from "./internal/files.js";
5
+ import { StateReadError } from "./schema.js";
6
+ const Dependency = Schema.Struct({ version: Schema.String });
7
+ const Importer = Schema.Struct({
8
+ dependencies: Schema.optionalKey(Schema.Record(Schema.String, Dependency)),
9
+ devDependencies: Schema.optionalKey(Schema.Record(Schema.String, Dependency))
10
+ });
11
+ const PnpmLock = Schema.Struct({ importers: Schema.Record(Schema.String, Importer) });
12
+ const BunLock = Schema.Struct({ packages: Schema.Record(Schema.String, Schema.Array(Schema.Unknown)) });
13
+ const exactVersion = /^(?:alchemy@)?(\d+\.\d+\.\d+(?:-[\w.-]+)?)(?:\(.*\))?$/u;
14
+ const decodeVersion = (resolved) => resolved === undefined ? null : exactVersion.exec(resolved)?.[1] ?? null;
15
+ const pnpmVersion = Effect.fn("AlchemyConsole.pnpmVersion")(function* (text, importer) {
16
+ const raw = yield* Effect.try({
17
+ try: () => parseYaml(text, { maxAliasCount: 0 }),
18
+ catch: () => new StateReadError({ reason: "invalid-lockfile" })
19
+ });
20
+ const lock = yield* Schema.decodeUnknownEffect(PnpmLock)(raw).pipe(Effect.mapError(() => new StateReadError({ reason: "invalid-lockfile" })));
21
+ const entry = lock.importers[importer];
22
+ return decodeVersion(entry?.dependencies?.alchemy?.version ?? entry?.devDependencies?.alchemy?.version);
23
+ });
24
+ const bunVersion = Effect.fn("AlchemyConsole.bunVersion")(function* (text) {
25
+ const errors = [];
26
+ const raw = yield* Effect.try({
27
+ try: () => parseJsonc(text, errors, { allowTrailingComma: true }),
28
+ catch: () => new StateReadError({ reason: "invalid-lockfile" })
29
+ });
30
+ if (errors.length > 0)
31
+ return yield* new StateReadError({ reason: "invalid-lockfile" });
32
+ const lock = yield* Schema.decodeUnknownEffect(BunLock)(raw).pipe(Effect.mapError(() => new StateReadError({ reason: "invalid-lockfile" })));
33
+ const resolved = lock.packages.alchemy?.[0];
34
+ if (resolved === undefined)
35
+ return null;
36
+ const version = yield* Schema.decodeUnknownEffect(Schema.String)(resolved).pipe(Effect.mapError(() => new StateReadError({ reason: "invalid-lockfile" })));
37
+ return decodeVersion(version);
38
+ });
39
+ /** Read the nearest pnpm or Bun text lockfile within an explicit server-private search root. */
40
+ export const readAlchemyVersion = Effect.fn("AlchemyConsole.readAlchemyVersion")(function* (projectDirectory, searchRoot) {
41
+ const fs = yield* FileSystem.FileSystem;
42
+ const path = yield* Path.Path;
43
+ const root = yield* fs.realPath(searchRoot).pipe(Effect.mapError(() => new StateReadError({ reason: "io" })));
44
+ const project = yield* withinRoot(root, projectDirectory);
45
+ let directory = project;
46
+ while (true) {
47
+ for (const name of ["pnpm-lock.yaml", "bun.lock"]) {
48
+ const candidate = path.join(directory, name);
49
+ if (!(yield* exists(candidate)))
50
+ continue;
51
+ const file = yield* withinRoot(root, candidate);
52
+ const text = yield* readText(file);
53
+ const importer = path.relative(directory, project).split(path.sep).join("/") || ".";
54
+ return yield* name === "bun.lock" ? bunVersion(text) : pnpmVersion(text, importer);
55
+ }
56
+ if (directory === root)
57
+ return null;
58
+ directory = path.dirname(directory);
59
+ }
60
+ });
61
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,52 @@
1
1
  {
2
2
  "name": "@knpkv/alchemy-console",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Read-only discovery and state readers for local Alchemy stacks",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/knpkv/npm.git",
9
+ "directory": "packages/alchemy-console"
10
+ },
11
+ "type": "module",
12
+ "sideEffects": false,
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md"
24
+ ],
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "peerDependencies": {
29
+ "effect": "4.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@effect/platform-node": "4.0.0",
33
+ "@effect/vitest": "4.0.0",
34
+ "@types/node": "^26.6.4",
35
+ "effect": "4.0.0",
36
+ "typescript": "npm:@typescript/typescript6@^6.0.2",
37
+ "vitest": "^5.0.3"
38
+ },
39
+ "dependencies": {
40
+ "@aws-sdk/credential-provider-sso": "^3.973.16",
41
+ "@distilled.cloud/aws": "^1.0.0-rc.13",
42
+ "jsonc-parser": "^3.3.1",
43
+ "yaml": "^2.9.1",
44
+ "@knpkv/bounded-io": "^0.2.0"
45
+ },
46
+ "scripts": {
47
+ "build": "tsc -b tsconfig.build.json --force",
48
+ "check": "tsc -b tsconfig.json && tsc -p test/tsconfig.json --noEmit",
49
+ "lint": "eslint src test",
50
+ "test": "vitest run"
51
+ }
6
52
  }