@dreamboard-games/cli 0.1.30-alpha.1 → 0.1.30-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +179 -22
  2. package/dist/{chunk-C6UAT6EH.js → chunk-N7XPNNUI.js} +9 -12
  3. package/dist/chunk-N7XPNNUI.js.map +1 -0
  4. package/dist/chunk-SEGVTWSK.js +44 -0
  5. package/dist/{chunk-RS7UXJZV.js → chunk-TAQKH67O.js} +21300 -35881
  6. package/dist/chunk-TAQKH67O.js.map +1 -0
  7. package/dist/{global-config-AGFBDFYD.js → global-config-S4ZIPECE.js} +3 -3
  8. package/dist/index.js +415 -37
  9. package/dist/index.js.map +1 -1
  10. package/dist/internal.js +3 -4
  11. package/dist/{agent-verifier/keychain-backend-TNOPQV3Z.mjs → keychain-backend-HDF4TZDL.js} +2 -1
  12. package/dist/{agent-verifier/prompt-3BAINGAQ.mjs → prompt-NDV3AE5L.js} +2 -1
  13. package/package.json +6 -6
  14. package/skills/dreamboard/references/building-your-first-game.md +510 -0
  15. package/skills/dreamboard/references/cli.md +104 -0
  16. package/skills/dreamboard/references/game-interface.md +548 -0
  17. package/skills/dreamboard/references/manifest-authoring.md +597 -0
  18. package/skills/dreamboard/references/quickstart.md +66 -0
  19. package/skills/dreamboard/references/reducer.md +864 -0
  20. package/skills/dreamboard/references/rule-authoring.md +147 -0
  21. package/skills/dreamboard/references/testing.md +249 -0
  22. package/skills/dreamboard/scripts/events-extract.mjs +218 -0
  23. package/dist/agent-verifier/agent-workspace-verifier.mjs +0 -227
  24. package/dist/agent-verifier/chunk-2E5P5NWG.mjs +0 -835
  25. package/dist/agent-verifier/chunk-2GBBP27W.mjs +0 -301
  26. package/dist/agent-verifier/chunk-2QMNAVV4.mjs +0 -14522
  27. package/dist/agent-verifier/chunk-2SZHMP6F.mjs +0 -264
  28. package/dist/agent-verifier/chunk-4WD3YU2E.mjs +0 -166
  29. package/dist/agent-verifier/chunk-54TAYXUD.mjs +0 -12
  30. package/dist/agent-verifier/chunk-6A5HRJMQ.mjs +0 -3174
  31. package/dist/agent-verifier/chunk-6UUJEYDV.mjs +0 -213
  32. package/dist/agent-verifier/chunk-7653FPGJ.mjs +0 -381
  33. package/dist/agent-verifier/chunk-7E65UQLY.mjs +0 -38
  34. package/dist/agent-verifier/chunk-BVVNBJM4.mjs +0 -221
  35. package/dist/agent-verifier/chunk-CEDUHGNH.mjs +0 -74
  36. package/dist/agent-verifier/chunk-CEQ2VJWN.mjs +0 -149
  37. package/dist/agent-verifier/chunk-CFU5EWIC.mjs +0 -69
  38. package/dist/agent-verifier/chunk-CJEEA6NJ.mjs +0 -730
  39. package/dist/agent-verifier/chunk-EIQWDQWJ.mjs +0 -186
  40. package/dist/agent-verifier/chunk-EOQIV6PS.mjs +0 -649
  41. package/dist/agent-verifier/chunk-HBNDKQT5.mjs +0 -8381
  42. package/dist/agent-verifier/chunk-HJFQDSTU.mjs +0 -225
  43. package/dist/agent-verifier/chunk-JH22JNYD.mjs +0 -1681
  44. package/dist/agent-verifier/chunk-LI3ZR3BI.mjs +0 -41
  45. package/dist/agent-verifier/chunk-LM3OZLZG.mjs +0 -48
  46. package/dist/agent-verifier/chunk-MINCYHXN.mjs +0 -106
  47. package/dist/agent-verifier/chunk-MRCUP5SW.mjs +0 -128
  48. package/dist/agent-verifier/chunk-RBDDIIPM.mjs +0 -19
  49. package/dist/agent-verifier/chunk-SHUMAVAP.mjs +0 -59
  50. package/dist/agent-verifier/chunk-SYPLYRGB.mjs +0 -2812
  51. package/dist/agent-verifier/chunk-U6OJN7XS.mjs +0 -8092
  52. package/dist/agent-verifier/chunk-VYJTHSYR.mjs +0 -44
  53. package/dist/agent-verifier/chunk-XYDL7GY6.mjs +0 -10
  54. package/dist/agent-verifier/compile-5QSPIOUT.mjs +0 -313
  55. package/dist/agent-verifier/global-config-WX3ZZIVU.mjs +0 -17
  56. package/dist/agent-verifier/local-files-MTPLP62S.mjs +0 -46
  57. package/dist/agent-verifier/local-typecheck-QFYYAZOK.mjs +0 -9
  58. package/dist/agent-verifier/materialize-workspace-FKALAE2T.mjs +0 -90
  59. package/dist/agent-verifier/project-state-7GR6BQTQ.mjs +0 -32
  60. package/dist/agent-verifier/reducer-bundle-preflight-C73LEXI2.mjs +0 -23
  61. package/dist/agent-verifier/reducer-contract-preflight-22X7DSZW.mjs +0 -10
  62. package/dist/agent-verifier/reducer-native-test-harness-GMWBUISX.mjs +0 -53
  63. package/dist/agent-verifier/static-scaffold-AJMZZQWS.mjs +0 -28
  64. package/dist/agent-verifier/sync-3DUQH32H.mjs +0 -594
  65. package/dist/agent-verifier/test-P4U5INTD.mjs +0 -356
  66. package/dist/agent-verifier/testing-5K2BJYF2.mjs +0 -674
  67. package/dist/agent-verifier/workspace-codegen-JDZJRSDV.mjs +0 -11
  68. package/dist/agent-verifier/workspace-dependencies-HZ6VVS4G.mjs +0 -14
  69. package/dist/chunk-2H7UOFLK.js +0 -11
  70. package/dist/chunk-7FOO4AJI.js +0 -50
  71. package/dist/chunk-7FOO4AJI.js.map +0 -1
  72. package/dist/chunk-C6UAT6EH.js.map +0 -1
  73. package/dist/chunk-RS7UXJZV.js.map +0 -1
  74. package/dist/internal.d.ts +0 -311
  75. package/dist/keychain-backend-JHTXAKWC.js +0 -135
  76. package/dist/prompt-GMZABCJC.js +0 -756
  77. package/dist/runtime-packages/ui-host-runtime/src/actor-principal.ts +0 -71
  78. package/dist/runtime-packages/ui-host-runtime/src/browser-interaction.ts +0 -139
  79. package/dist/runtime-packages/ui-host-runtime/src/components/host-controls.tsx +0 -374
  80. package/dist/runtime-packages/ui-host-runtime/src/components/host-feedback-toaster.tsx +0 -266
  81. package/dist/runtime-packages/ui-host-runtime/src/components/host-feedback.tsx +0 -212
  82. package/dist/runtime-packages/ui-host-runtime/src/components/host-primitives.tsx +0 -271
  83. package/dist/runtime-packages/ui-host-runtime/src/components/host-session-metadata.tsx +0 -135
  84. package/dist/runtime-packages/ui-host-runtime/src/components/index.ts +0 -5
  85. package/dist/runtime-packages/ui-host-runtime/src/components/perf-overlay.tsx +0 -194
  86. package/dist/runtime-packages/ui-host-runtime/src/gameplay-authority-transport.ts +0 -626
  87. package/dist/runtime-packages/ui-host-runtime/src/host-controls.tsx +0 -1
  88. package/dist/runtime-packages/ui-host-runtime/src/host-feedback.tsx +0 -1
  89. package/dist/runtime-packages/ui-host-runtime/src/host-session-transport.ts +0 -294
  90. package/dist/runtime-packages/ui-host-runtime/src/index.ts +0 -3
  91. package/dist/runtime-packages/ui-host-runtime/src/logger.ts +0 -11
  92. package/dist/runtime-packages/ui-host-runtime/src/perf.ts +0 -324
  93. package/dist/runtime-packages/ui-host-runtime/src/plugin-bridge.ts +0 -195
  94. package/dist/runtime-packages/ui-host-runtime/src/plugin-health-check.ts +0 -138
  95. package/dist/runtime-packages/ui-host-runtime/src/plugin-messages.ts +0 -159
  96. package/dist/runtime-packages/ui-host-runtime/src/plugin-session-gateway.ts +0 -551
  97. package/dist/runtime-packages/ui-host-runtime/src/runtime/index.ts +0 -13
  98. package/dist/runtime-packages/ui-host-runtime/src/screenshot/projection-to-snapshot.ts +0 -122
  99. package/dist/runtime-packages/ui-host-runtime/src/screenshot/static-store-api.ts +0 -26
  100. package/dist/runtime-packages/ui-host-runtime/src/session-ingress-controller.ts +0 -583
  101. package/dist/runtime-packages/ui-host-runtime/src/session-ingress.ts +0 -219
  102. package/dist/runtime-packages/ui-host-runtime/src/session-live-runtime.ts +0 -117
  103. package/dist/runtime-packages/ui-host-runtime/src/session-model.ts +0 -431
  104. package/dist/runtime-packages/ui-host-runtime/src/session-projection.ts +0 -211
  105. package/dist/runtime-packages/ui-host-runtime/src/session-recovery.ts +0 -80
  106. package/dist/runtime-packages/ui-host-runtime/src/session-state-reducer.ts +0 -1034
  107. package/dist/runtime-packages/ui-host-runtime/src/sse-manager.ts +0 -416
  108. package/dist/runtime-packages/ui-host-runtime/src/unified-session-store.ts +0 -184
  109. package/dist/testing-KLSV6CPJ.js +0 -674
  110. package/dist/testing-KLSV6CPJ.js.map +0 -1
  111. /package/dist/{chunk-2H7UOFLK.js.map → chunk-SEGVTWSK.js.map} +0 -0
  112. /package/dist/{global-config-AGFBDFYD.js.map → global-config-S4ZIPECE.js.map} +0 -0
  113. /package/dist/{keychain-backend-JHTXAKWC.js.map → keychain-backend-HDF4TZDL.js.map} +0 -0
  114. /package/dist/{prompt-GMZABCJC.js.map → prompt-NDV3AE5L.js.map} +0 -0
@@ -1,311 +0,0 @@
1
- import { z } from 'zod';
2
- import { CompiledResult } from '@dreamboard-games/api-client';
3
- import { GameTopologyManifest } from '@dreamboard-games/sdk/types';
4
-
5
- type Environment = "local" | "staging" | "prod";
6
- type LocalMaintainerRegistryPackages = {
7
- "@dreamboard-games/api-client"?: string;
8
- "@dreamboard-games/sdk": string;
9
- };
10
- type LocalMaintainerRegistryConfig = {
11
- registryUrl: string;
12
- snapshotId: string;
13
- fingerprint: string;
14
- publishedAt: string;
15
- packages: LocalMaintainerRegistryPackages;
16
- };
17
- type EnvironmentConfig = {
18
- apiBaseUrl: string;
19
- webBaseUrl: string;
20
- clerkOAuthIssuer?: string;
21
- clerkOAuthClientId?: string;
22
- clerkOAuthScope?: string;
23
- };
24
- /**
25
- * Non-credential configuration persisted at `~/.dreamboard/config.json`.
26
- *
27
- * IMPORTANT: `authToken` and `refreshToken` intentionally do NOT live here.
28
- * Credentials are owned exclusively by the `CredentialStore` module
29
- * (`config/credential-store.ts`). Mixing them into `GlobalConfig` was the
30
- * root cause of the refresh-token-wipe bug: `saveGlobalConfig({ ...config })`
31
- * could silently erase stored credentials if the caller forgot to include
32
- * them. With credentials removed from this type, that failure mode is a
33
- * type error.
34
- *
35
- * `credentialBackend` is a *selector*, not a credential: it only says where
36
- * tokens are stored. The default (unset) is `"file"` because the OS keychain
37
- * prompts the user for their login password on first use on macOS (and is
38
- * re-prompted whenever the Node binary signature changes, e.g. after an
39
- * `nvm`/`volta` upgrade). Users who want encrypted-at-rest storage can opt
40
- * in by writing `"credentialBackend": "keychain"` into this file.
41
- */
42
- type CredentialBackendPreference = "file" | "keychain";
43
- type GlobalConfig = {
44
- environment?: Environment;
45
- credentialBackend?: CredentialBackendPreference;
46
- };
47
- type ProjectPendingSyncPhase = "source_revision_created" | "authoring_state_created";
48
- type ProjectPendingAuthoringSync = {
49
- phase: ProjectPendingSyncPhase;
50
- revisionDigest?: string;
51
- authoringStateId?: string;
52
- ruleId?: string;
53
- manifestId?: string;
54
- manifestContentHash?: string;
55
- localManifestContentHash?: string;
56
- sourceRevisionId: string;
57
- sourceTreeHash: string;
58
- };
59
- type ProjectAuthoringState = {
60
- revisionDigest?: string;
61
- authoringStateId?: string;
62
- ruleId?: string;
63
- manifestId?: string;
64
- manifestContentHash?: string;
65
- localManifestContentHash?: string;
66
- sourceRevisionId?: string;
67
- sourceTreeHash?: string;
68
- pendingSync?: ProjectPendingAuthoringSync;
69
- };
70
- type ProjectCompileAttempt = {
71
- resultId?: string;
72
- jobId?: string;
73
- revisionDigest?: string;
74
- authoringStateId: string;
75
- status: "successful" | "failed";
76
- diagnosticsSummary?: string;
77
- };
78
- type ProjectCompileState = {
79
- latestAttempt?: ProjectCompileAttempt;
80
- latestSuccessful?: {
81
- resultId: string;
82
- authoringStateId: string;
83
- revisionDigest?: string;
84
- };
85
- };
86
- type ProjectManifestV2 = {
87
- schemaVersion: 2;
88
- projectId: string;
89
- slug: string;
90
- };
91
- type ProjectEnvironmentBindingV1 = {
92
- deploymentId: string;
93
- ownerScopeId: string;
94
- gameId?: string;
95
- remoteHeadDigest?: string;
96
- jobId?: string;
97
- agentManaged?: boolean;
98
- workspacePrepared?: boolean;
99
- allowCreateGame?: boolean;
100
- environment?: Environment;
101
- authoring?: ProjectAuthoringState;
102
- compile?: ProjectCompileState;
103
- localMaintainerRegistry?: LocalMaintainerRegistryConfig;
104
- apiBaseUrl?: string;
105
- webBaseUrl?: string;
106
- packageManifest?: Record<string, unknown>;
107
- environmentManifest?: Record<string, unknown>;
108
- };
109
- type ProjectConfig = ProjectManifestV2 & Omit<ProjectEnvironmentBindingV1, "gameId"> & {
110
- gameId: string;
111
- bindingKey?: string;
112
- };
113
- /**
114
- * A resolved, read-only snapshot of "what should this CLI invocation do".
115
- *
116
- * `authToken` and `refreshToken` are read-only projections of the active
117
- * credentials at the moment `resolveConfig` runs. They are marked `readonly`
118
- * to discourage reassignment from command code; the refresh path never
119
- * mutates this object and instead goes through `CredentialStore` directly.
120
- * Persisting a `ResolvedConfig` back into `GlobalConfig`/`auth.json` is
121
- * not possible because `GlobalConfig` has no credential fields.
122
- */
123
- type ResolvedConfig = {
124
- readonly environment: Environment;
125
- readonly apiBaseUrl: string;
126
- readonly webBaseUrl: string;
127
- readonly authToken?: string;
128
- readonly refreshToken?: string;
129
- readonly tokenExpiresAt?: string;
130
- readonly clerkOAuthIssuer?: string;
131
- readonly clerkOAuthClientId?: string;
132
- readonly clerkOAuthTokenUrl?: string;
133
- readonly clerkOAuthScope?: string;
134
- readonly authTokenSource?: "global" | "env" | "agent-env" | "flag" | "none";
135
- readonly refreshTokenSource?: "global" | "env" | "none";
136
- };
137
-
138
- declare const configFlagsSchema: z.ZodObject<{
139
- env: z.ZodOptional<z.ZodEnum<{
140
- local: "local";
141
- staging: "staging";
142
- prod: "prod";
143
- }>>;
144
- token: z.ZodOptional<z.ZodString>;
145
- }, z.core.$strip>;
146
- type ConfigFlags = z.infer<typeof configFlagsSchema>;
147
- declare function parseConfigFlags(args: unknown): ConfigFlags;
148
-
149
- /**
150
- * Single writer for the long-lived Dreamboard session credentials.
151
- *
152
- * Design invariants (enforced at the type level and tested in
153
- * `credential-store.test.ts`):
154
- *
155
- * 1. This module is the ONLY place in the CLI that writes credentials to
156
- * disk or the OS keychain. `global-config.ts` used to own both the
157
- * config and the credentials via `saveGlobalConfig`, which made it
158
- * trivial to wipe a refresh token by accident. The `GlobalConfig` type
159
- * no longer carries credentials, so attempting to persist one through
160
- * the config path is a type error.
161
- *
162
- * 2. The mutating surface is intentionally narrow:
163
- * - `setCredentials(c)` for refreshable sessions (both tokens present)
164
- * - `setAccessOnlySession(accessToken)` for the `auth set` / `config set
165
- * --token` power-user path, which has no refresh token by
166
- * construction
167
- * - `clearCredentials()` wipes the file entirely
168
- * There is no "partial update" API. `Credentials` requires both
169
- * `accessToken` and `refreshToken`, so it is impossible to persist a
170
- * half-populated refreshable session.
171
- *
172
- * 3. Writes go through `atomicWriteFile` + `withFileLock`, so a crash or
173
- * interrupt during `dreamboard sync`/`compile` cannot leave `auth.json`
174
- * truncated, and parallel CLI invocations cannot clobber each other's
175
- * rotated refresh tokens.
176
- *
177
- * 4. The on-disk JSON shape for the file backend is kept backward
178
- * compatible: we continue to read/write `authToken` + `refreshToken`
179
- * so existing users are not forced to log in again after this change.
180
- * A newer `accessToken` key is also accepted for read to ease any
181
- * future format bump.
182
- *
183
- * 5. The file backend is the default. The OS keychain is opt-in via
184
- * `credentialBackend: "keychain"` in `~/.dreamboard/config.json`
185
- * because on macOS the first keychain write triggers a login-password
186
- * prompt, and re-prompts whenever the executing Node binary's code
187
- * signature changes (e.g. after an `nvm`/`volta` upgrade). Users who
188
- * want encrypted-at-rest storage can opt in explicitly; everyone else
189
- * gets a zero-prompt experience.
190
- */
191
-
192
- /**
193
- * Raw on-disk snapshot. Either or both fields may be present. The refresh
194
- * coordinator only acts on snapshots that have both tokens populated.
195
- */
196
- type StoredSessionSnapshot = {
197
- readonly accessToken?: string;
198
- readonly refreshToken?: string;
199
- readonly tokenExpiresAt?: string;
200
- readonly clerkOAuthIssuer?: string;
201
- readonly clerkOAuthClientId?: string;
202
- readonly clerkOAuthTokenUrl?: string;
203
- readonly environment?: string;
204
- };
205
- /** Loose read: returns whatever is on disk, including access-only sessions. */
206
- declare function getStoredSession(): Promise<StoredSessionSnapshot | null>;
207
-
208
- /**
209
- * Resolve the effective CLI config for this invocation.
210
- *
211
- * `resolveConfig` is pure and synchronous: it takes pre-loaded inputs
212
- * (global config, flags, optional project config, optional credential
213
- * snapshot) and assembles a read-only `ResolvedConfig`. It intentionally
214
- * does not touch disk or the network - refreshing/persisting credentials
215
- * is the job of `configureClient` + `RefreshCoordinator`.
216
- *
217
- * Passing `credentials = undefined` is equivalent to "no stored session
218
- * for this call", used by contexts that should never inherit the local
219
- * session (e.g. `dreamboard login` before the browser flow).
220
- */
221
- declare function resolveConfig(globalConfig: GlobalConfig, flags: ConfigFlags, project?: ProjectConfig, credentials?: StoredSessionSnapshot | null): ResolvedConfig;
222
- /**
223
- * Configure the API client for the resolved environment, refreshing the
224
- * stored CLI session first if it is close to expiry.
225
- *
226
- * The refresh path never mutates `config`. It goes through
227
- * Clerk OAuth directly and the CredentialStore writes. After a successful
228
- * rotation the HTTP client
229
- * is configured with the rotated access token; on transient failures we
230
- * fall back to the `config.authToken` snapshot (which is why commands
231
- * still see a bearer header and can surface the original error).
232
- */
233
- declare function configureClient(config: ResolvedConfig): Promise<void>;
234
- declare function requireAuth(config: ResolvedConfig): void;
235
- /**
236
- * Common init pattern used by pull, push, status, update, run commands:
237
- * find project root, load config, resolve config, require auth,
238
- * configure client.
239
- */
240
- declare function resolveProjectContext(flags: ConfigFlags, opts?: {
241
- requireAuth?: boolean;
242
- }): Promise<{
243
- projectRoot: string;
244
- projectConfig: ProjectConfig;
245
- config: ResolvedConfig;
246
- }>;
247
-
248
- /**
249
- * Load non-credential CLI configuration.
250
- *
251
- * Note: this function used to also load `authToken` / `refreshToken`
252
- * from `auth.json` and flatten them onto `GlobalConfig`. That shape
253
- * enabled the refresh-token-wipe bug: `saveGlobalConfig({ ...config })`
254
- * without explicit auth fields erased the stored refresh token.
255
- *
256
- * Credentials are now owned exclusively by `CredentialStore`. Callers
257
- * that need them must import `getCredentials()` directly.
258
- */
259
- declare function loadGlobalConfig(): Promise<GlobalConfig>;
260
-
261
- declare const CONFIG_FLAG_ARGS: {
262
- env: {
263
- type: "string";
264
- description: string;
265
- };
266
- token: {
267
- type: "string";
268
- description: string;
269
- };
270
- };
271
-
272
- declare const ENVIRONMENT_CONFIGS: Record<string, EnvironmentConfig>;
273
-
274
- declare function loadProjectConfig(rootDir: string): Promise<ProjectConfig>;
275
- declare function updateProjectState(rootDir: string, config: ProjectConfig): Promise<void>;
276
-
277
- declare function readJsonFile<T>(filePath: string): Promise<T>;
278
- declare function writeJsonFile(filePath: string, data: unknown): Promise<void>;
279
-
280
- declare function findCompiledResultsForAuthoringState(options: {
281
- gameId: string;
282
- authoringStateId: string;
283
- }): Promise<CompiledResult[]>;
284
-
285
- declare function setLatestCompileAttempt(projectConfig: ProjectConfig, attempt: ProjectCompileAttempt): ProjectConfig;
286
-
287
- declare function loadManifest(rootDir: string): Promise<GameTopologyManifest>;
288
-
289
- declare function writeSnapshot(rootDir: string): Promise<void>;
290
-
291
- interface WorkspaceCodegenWriteResult {
292
- written: string[];
293
- skipped: string[];
294
- merged: string[];
295
- }
296
- declare function applyWorkspaceCodegen(options: {
297
- projectRoot: string;
298
- manifest: GameTopologyManifest;
299
- }): Promise<WorkspaceCodegenWriteResult>;
300
-
301
- declare function ensureReducerNativeTestingFiles(projectRoot: string): Promise<void>;
302
-
303
- declare function shortHash(value: string): string;
304
-
305
- /**
306
- * Browser test runner helpers shared with reducer-native-test-harness (browser runner).
307
- * Screenshot / JSON scenario navigation helpers lived in the deleted `run` command.
308
- */
309
- declare function configurePlaywrightBrowsersPath(): void;
310
-
311
- export { CONFIG_FLAG_ARGS, type ConfigFlags, ENVIRONMENT_CONFIGS, type ProjectConfig, type ResolvedConfig, applyWorkspaceCodegen, configureClient, configurePlaywrightBrowsersPath, ensureReducerNativeTestingFiles, findCompiledResultsForAuthoringState, getStoredSession, loadGlobalConfig, loadManifest, loadProjectConfig, parseConfigFlags, readJsonFile, requireAuth, resolveConfig, resolveProjectContext, setLatestCompileAttempt, shortHash, updateProjectState, writeJsonFile, writeSnapshot };
@@ -1,135 +0,0 @@
1
- #!/usr/bin/env node
2
- import "./chunk-2H7UOFLK.js";
3
-
4
- // src/config/keychain-backend.ts
5
- var KEYCHAIN_SERVICE = "dreamboard-cli";
6
- var KEYCHAIN_ACCOUNT = "session";
7
- var cachedModule;
8
- async function loadKeyringModule() {
9
- if (cachedModule !== void 0) return cachedModule;
10
- try {
11
- const mod = await import("@napi-rs/keyring");
12
- cachedModule = mod;
13
- } catch {
14
- cachedModule = null;
15
- }
16
- return cachedModule;
17
- }
18
- function keychainProbe(entry) {
19
- try {
20
- entry.getPassword();
21
- return true;
22
- } catch {
23
- return false;
24
- }
25
- }
26
- function parsePayload(raw) {
27
- if (raw === null || raw === void 0) return null;
28
- const trimmed = raw.trim();
29
- if (trimmed.length === 0) return null;
30
- try {
31
- const parsed = JSON.parse(trimmed);
32
- if (!parsed.accessToken && !parsed.refreshToken) return null;
33
- return {
34
- accessToken: parsed.accessToken || void 0,
35
- refreshToken: parsed.refreshToken || void 0,
36
- tokenExpiresAt: parsed.tokenExpiresAt || void 0,
37
- clerkOAuthIssuer: parsed.clerkOAuthIssuer || void 0,
38
- clerkOAuthClientId: parsed.clerkOAuthClientId || void 0,
39
- clerkOAuthTokenUrl: parsed.clerkOAuthTokenUrl || void 0,
40
- environment: parsed.environment || void 0
41
- };
42
- } catch {
43
- return null;
44
- }
45
- }
46
- function writeFull(entry, creds) {
47
- if (!creds.accessToken || !creds.refreshToken) {
48
- throw new Error(
49
- "Refusing to persist credentials with an empty accessToken or refreshToken."
50
- );
51
- }
52
- const payload = {
53
- accessToken: creds.accessToken,
54
- refreshToken: creds.refreshToken,
55
- tokenExpiresAt: creds.tokenExpiresAt,
56
- clerkOAuthIssuer: creds.clerkOAuthIssuer,
57
- clerkOAuthClientId: creds.clerkOAuthClientId,
58
- clerkOAuthTokenUrl: creds.clerkOAuthTokenUrl,
59
- environment: creds.environment
60
- };
61
- entry.setPassword(JSON.stringify(payload));
62
- }
63
- function writeAccessOnly(entry, accessToken) {
64
- if (!accessToken) {
65
- throw new Error("Refusing to persist an empty access token.");
66
- }
67
- const payload = { accessToken };
68
- entry.setPassword(JSON.stringify(payload));
69
- }
70
- function clear(entry) {
71
- try {
72
- entry.deletePassword();
73
- } catch {
74
- }
75
- }
76
- async function tryKeychainBackend() {
77
- const mod = await loadKeyringModule();
78
- if (!mod) {
79
- return {
80
- available: false,
81
- reason: "@napi-rs/keyring is not installed for this platform"
82
- };
83
- }
84
- let entry;
85
- try {
86
- entry = new mod.Entry(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
87
- } catch (err) {
88
- return {
89
- available: false,
90
- reason: `Failed to construct keyring entry: ${String(err.message ?? err)}`
91
- };
92
- }
93
- if (!keychainProbe(entry)) {
94
- return {
95
- available: false,
96
- reason: "OS keyring is not accessible from this process"
97
- };
98
- }
99
- const backend = {
100
- name: "keychain",
101
- async read() {
102
- try {
103
- return parsePayload(entry.getPassword());
104
- } catch (err) {
105
- const message = String(err.message ?? err);
106
- if (/no matching entry|not found/i.test(message)) {
107
- return null;
108
- }
109
- throw err;
110
- }
111
- },
112
- async writeFull(creds) {
113
- writeFull(entry, creds);
114
- },
115
- async writeAccessOnly(accessToken) {
116
- writeAccessOnly(entry, accessToken);
117
- },
118
- async clear() {
119
- clear(entry);
120
- }
121
- };
122
- return { available: true, backend };
123
- }
124
- function _setKeyringModuleForTests(mod) {
125
- cachedModule = mod;
126
- }
127
- function _resetKeyringModuleForTests() {
128
- cachedModule = void 0;
129
- }
130
- export {
131
- _resetKeyringModuleForTests,
132
- _setKeyringModuleForTests,
133
- tryKeychainBackend
134
- };
135
- //# sourceMappingURL=keychain-backend-JHTXAKWC.js.map