primitive-admin 1.2.0-alpha.0 → 1.2.0-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 (137) hide show
  1. package/README.md +6 -4
  2. package/dist/bin/primitive.js +22 -24
  3. package/dist/bin/primitive.js.map +1 -1
  4. package/dist/src/commands/agent-sessions.d.ts +20 -0
  5. package/dist/src/commands/agent-sessions.js +275 -0
  6. package/dist/src/commands/agent-sessions.js.map +1 -0
  7. package/dist/src/commands/apps-children.d.ts +54 -0
  8. package/dist/src/commands/apps-children.js +578 -0
  9. package/dist/src/commands/apps-children.js.map +1 -0
  10. package/dist/src/commands/apps.js +88 -9
  11. package/dist/src/commands/apps.js.map +1 -1
  12. package/dist/src/commands/auth-sessions.d.ts +3 -3
  13. package/dist/src/commands/auth-sessions.js +117 -23
  14. package/dist/src/commands/auth-sessions.js.map +1 -1
  15. package/dist/src/commands/auth.js +248 -15
  16. package/dist/src/commands/auth.js.map +1 -1
  17. package/dist/src/commands/connections.js +1 -5
  18. package/dist/src/commands/connections.js.map +1 -1
  19. package/dist/src/commands/databases.js +7 -109
  20. package/dist/src/commands/databases.js.map +1 -1
  21. package/dist/src/commands/documents.d.ts +29 -0
  22. package/dist/src/commands/documents.js +676 -191
  23. package/dist/src/commands/documents.js.map +1 -1
  24. package/dist/src/commands/env.d.ts +9 -1
  25. package/dist/src/commands/env.js +158 -45
  26. package/dist/src/commands/env.js.map +1 -1
  27. package/dist/src/commands/functions.js +7 -1
  28. package/dist/src/commands/functions.js.map +1 -1
  29. package/dist/src/commands/init.js +2 -1
  30. package/dist/src/commands/init.js.map +1 -1
  31. package/dist/src/commands/integrations.js +14 -2
  32. package/dist/src/commands/integrations.js.map +1 -1
  33. package/dist/src/commands/prompts.js +4 -0
  34. package/dist/src/commands/prompts.js.map +1 -1
  35. package/dist/src/commands/scripts.js +1 -1
  36. package/dist/src/commands/scripts.js.map +1 -1
  37. package/dist/src/commands/sessions.js +3 -8
  38. package/dist/src/commands/sessions.js.map +1 -1
  39. package/dist/src/commands/sync-app-settings.d.ts +25 -7
  40. package/dist/src/commands/sync-app-settings.js +81 -20
  41. package/dist/src/commands/sync-app-settings.js.map +1 -1
  42. package/dist/src/commands/sync.d.ts +183 -12
  43. package/dist/src/commands/sync.js +974 -452
  44. package/dist/src/commands/sync.js.map +1 -1
  45. package/dist/src/commands/tokens.js +1 -6
  46. package/dist/src/commands/tokens.js.map +1 -1
  47. package/dist/src/commands/users.js +77 -2
  48. package/dist/src/commands/users.js.map +1 -1
  49. package/dist/src/lib/api-client.d.ts +161 -35
  50. package/dist/src/lib/api-client.js +210 -86
  51. package/dist/src/lib/api-client.js.map +1 -1
  52. package/dist/src/lib/app-settings-descriptor.d.ts +9 -1
  53. package/dist/src/lib/app-settings-descriptor.js +22 -10
  54. package/dist/src/lib/app-settings-descriptor.js.map +1 -1
  55. package/dist/src/lib/auth-flow.d.ts +41 -1
  56. package/dist/src/lib/auth-flow.js +45 -16
  57. package/dist/src/lib/auth-flow.js.map +1 -1
  58. package/dist/src/lib/child-apps-local.d.ts +184 -0
  59. package/dist/src/lib/child-apps-local.js +282 -0
  60. package/dist/src/lib/child-apps-local.js.map +1 -0
  61. package/dist/src/lib/ci-session-request.d.ts +22 -0
  62. package/dist/src/lib/ci-session-request.js +51 -0
  63. package/dist/src/lib/ci-session-request.js.map +1 -0
  64. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +4 -1
  65. package/dist/src/lib/codegen-shared/generatedFiles.js +19 -13
  66. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -1
  67. package/dist/src/lib/config-object-descriptor.js +5 -5
  68. package/dist/src/lib/config-object-descriptor.js.map +1 -1
  69. package/dist/src/lib/config-payload.js +2 -3
  70. package/dist/src/lib/config-payload.js.map +1 -1
  71. package/dist/src/lib/config-surface.d.ts +2 -1
  72. package/dist/src/lib/config-surface.js +7 -28
  73. package/dist/src/lib/config-surface.js.map +1 -1
  74. package/dist/src/lib/credentials-store.d.ts +17 -2
  75. package/dist/src/lib/credentials-store.js +72 -6
  76. package/dist/src/lib/credentials-store.js.map +1 -1
  77. package/dist/src/lib/document-export-lookups.d.ts +31 -0
  78. package/dist/src/lib/document-export-lookups.js +53 -0
  79. package/dist/src/lib/document-export-lookups.js.map +1 -0
  80. package/dist/src/lib/document-export-permissions.d.ts +7 -5
  81. package/dist/src/lib/document-export-permissions.js +7 -5
  82. package/dist/src/lib/document-export-permissions.js.map +1 -1
  83. package/dist/src/lib/env-resolver-core.d.ts +69 -1
  84. package/dist/src/lib/env-resolver-core.js +137 -20
  85. package/dist/src/lib/env-resolver-core.js.map +1 -1
  86. package/dist/src/lib/env-resolver.d.ts +14 -2
  87. package/dist/src/lib/env-resolver.js +32 -10
  88. package/dist/src/lib/env-resolver.js.map +1 -1
  89. package/dist/src/lib/function-run.d.ts +4 -1
  90. package/dist/src/lib/function-run.js +24 -4
  91. package/dist/src/lib/function-run.js.map +1 -1
  92. package/dist/src/lib/function-sync.d.ts +5 -2
  93. package/dist/src/lib/function-sync.js +7 -4
  94. package/dist/src/lib/function-sync.js.map +1 -1
  95. package/dist/src/lib/generated-config-surfaces.d.ts +49 -50
  96. package/dist/src/lib/generated-config-surfaces.js +283 -166
  97. package/dist/src/lib/generated-config-surfaces.js.map +1 -1
  98. package/dist/src/lib/generated-sdk-types.d.ts +1 -1
  99. package/dist/src/lib/generated-sdk-types.js +1 -1
  100. package/dist/src/lib/generated-sdk-types.js.map +1 -1
  101. package/dist/src/lib/init-adopt.js +12 -3
  102. package/dist/src/lib/init-adopt.js.map +1 -1
  103. package/dist/src/lib/local-state.d.ts +17 -1
  104. package/dist/src/lib/local-state.js +94 -15
  105. package/dist/src/lib/local-state.js.map +1 -1
  106. package/dist/src/lib/local-test-cases.d.ts +5 -2
  107. package/dist/src/lib/local-test-cases.js +7 -4
  108. package/dist/src/lib/local-test-cases.js.map +1 -1
  109. package/dist/src/lib/log-inspection.d.ts +25 -0
  110. package/dist/src/lib/log-inspection.js +24 -0
  111. package/dist/src/lib/log-inspection.js.map +1 -1
  112. package/dist/src/lib/logout-admin-session.d.ts +2 -1
  113. package/dist/src/lib/logout-admin-session.js +7 -1
  114. package/dist/src/lib/logout-admin-session.js.map +1 -1
  115. package/dist/src/lib/pull-write.d.ts +31 -0
  116. package/dist/src/lib/pull-write.js +49 -0
  117. package/dist/src/lib/pull-write.js.map +1 -0
  118. package/dist/src/lib/root-import-decision.d.ts +59 -0
  119. package/dist/src/lib/root-import-decision.js +95 -0
  120. package/dist/src/lib/root-import-decision.js.map +1 -0
  121. package/dist/src/lib/scope-request.d.ts +69 -0
  122. package/dist/src/lib/scope-request.js +188 -0
  123. package/dist/src/lib/scope-request.js.map +1 -0
  124. package/dist/src/lib/session-id.d.ts +9 -0
  125. package/dist/src/lib/session-id.js +28 -0
  126. package/dist/src/lib/session-id.js.map +1 -0
  127. package/dist/src/lib/snapshots.d.ts +17 -1
  128. package/dist/src/lib/snapshots.js +50 -2
  129. package/dist/src/lib/snapshots.js.map +1 -1
  130. package/dist/src/lib/sync-paths.d.ts +35 -0
  131. package/dist/src/lib/sync-paths.js +57 -5
  132. package/dist/src/lib/sync-paths.js.map +1 -1
  133. package/dist/src/lib/transient-retry.d.ts +34 -0
  134. package/dist/src/lib/transient-retry.js +57 -0
  135. package/dist/src/lib/transient-retry.js.map +1 -0
  136. package/dist/src/types/index.d.ts +21 -4
  137. package/package.json +4 -3
@@ -0,0 +1,59 @@
1
+ /**
2
+ * What `documents import` does with a root document export, by format
3
+ * (#4195).
4
+ *
5
+ * A root document is either a legacy document (its export is one Yjs state,
6
+ * MERGED into the target user's root) or a large document (its export is a
7
+ * chain, INSTALLED into the target user's root, and only into one that holds
8
+ * nothing yet). Neither can go into the other, so a mismatch is refused before
9
+ * the run writes anything. When the target user has no root yet, the app's
10
+ * `rootDocumentFormat` setting predicts the format the mint will produce; the
11
+ * root the mint actually returns is decided again against that prediction.
12
+ *
13
+ * Pure, so every branch is pinned without a server.
14
+ */
15
+ /** A root document's storage format: 1 (legacy) or 2 (large document). */
16
+ export type RootDocumentFormat = 1 | 2;
17
+ /** The facts a root import is decided from. */
18
+ export interface RootImportDecisionInput {
19
+ /** The format `metadata.json` records for the export. */
20
+ exportFormat: RootDocumentFormat;
21
+ /** The target user's root's format, or null when they have none yet. */
22
+ existingRootFormat: RootDocumentFormat | null;
23
+ /** The target app's `rootDocumentFormat` setting, as the server reports it. */
24
+ appSetting: unknown;
25
+ /** Whether `--overwrite` was given (or the root was minted by this run). */
26
+ overwrite: boolean;
27
+ /**
28
+ * The format the plan predicted for a root this run minted. Given only when
29
+ * re-deciding against the root the mint returned.
30
+ */
31
+ predictedFormat?: RootDocumentFormat;
32
+ /** The target user, as the operator named them, for the reasons. */
33
+ owner?: string;
34
+ /** The target user's root document id, when they have one, for the reasons. */
35
+ targetRootDocId?: string;
36
+ }
37
+ /** What to do with a root export. */
38
+ export type RootImportDecision = {
39
+ outcome: "install" | "merge";
40
+ targetFormat: RootDocumentFormat;
41
+ } | {
42
+ outcome: "skip" | "refuse";
43
+ targetFormat: RootDocumentFormat;
44
+ reason: string;
45
+ };
46
+ /** Read a format off the wire: 2 is a large document, anything else legacy. */
47
+ export declare function rootDocumentFormatOf(value: unknown): RootDocumentFormat;
48
+ /**
49
+ * Decide what a root export does in the target app.
50
+ *
51
+ * - The formats match: `install` (large) or `merge` (legacy) — into an
52
+ * existing root only with `overwrite`, otherwise `skip`.
53
+ * - They differ: `refuse`, naming both formats, whatever `overwrite` says.
54
+ * - No root yet: the app's setting predicts the mint (2 is large, absent or 1
55
+ * legacy) and the same rule applies to the prediction.
56
+ * - A `predictedFormat` that the minted root contradicts: `refuse` — the
57
+ * setting changed while the import ran.
58
+ */
59
+ export declare function decideRootImport(input: RootImportDecisionInput): RootImportDecision;
@@ -0,0 +1,95 @@
1
+ /**
2
+ * What `documents import` does with a root document export, by format
3
+ * (#4195).
4
+ *
5
+ * A root document is either a legacy document (its export is one Yjs state,
6
+ * MERGED into the target user's root) or a large document (its export is a
7
+ * chain, INSTALLED into the target user's root, and only into one that holds
8
+ * nothing yet). Neither can go into the other, so a mismatch is refused before
9
+ * the run writes anything. When the target user has no root yet, the app's
10
+ * `rootDocumentFormat` setting predicts the format the mint will produce; the
11
+ * root the mint actually returns is decided again against that prediction.
12
+ *
13
+ * Pure, so every branch is pinned without a server.
14
+ */
15
+ /** Read a format off the wire: 2 is a large document, anything else legacy. */
16
+ export function rootDocumentFormatOf(value) {
17
+ return Number(value) === 2 ? 2 : 1;
18
+ }
19
+ /** How a reason names a format. */
20
+ function describe(format) {
21
+ return format === 2
22
+ ? "a large document (documentFormat 2)"
23
+ : "a legacy document (documentFormat 1)";
24
+ }
25
+ const REMEDY = "A large-document export is installed as a chain and a legacy export is " +
26
+ "merged as a Yjs state, so neither can go into the other. Import it into " +
27
+ "an app whose rootDocumentFormat matches the export, or into a user whose " +
28
+ "root document has the export's format. Nothing was imported for it.";
29
+ /**
30
+ * Decide what a root export does in the target app.
31
+ *
32
+ * - The formats match: `install` (large) or `merge` (legacy) — into an
33
+ * existing root only with `overwrite`, otherwise `skip`.
34
+ * - They differ: `refuse`, naming both formats, whatever `overwrite` says.
35
+ * - No root yet: the app's setting predicts the mint (2 is large, absent or 1
36
+ * legacy) and the same rule applies to the prediction.
37
+ * - A `predictedFormat` that the minted root contradicts: `refuse` — the
38
+ * setting changed while the import ran.
39
+ */
40
+ export function decideRootImport(input) {
41
+ const whose = (input.owner
42
+ ? `the root document of ${input.owner}`
43
+ : "the target user's root document") +
44
+ (input.targetRootDocId ? ` (${input.targetRootDocId})` : "");
45
+ const exportIs = `it is a root document exported as ${describe(input.exportFormat)}`;
46
+ if (input.existingRootFormat === null) {
47
+ const predicted = rootDocumentFormatOf(input.appSetting);
48
+ if (predicted !== input.exportFormat) {
49
+ return {
50
+ outcome: "refuse",
51
+ targetFormat: predicted,
52
+ reason: `${exportIs}, and this app's rootDocumentFormat would mint ` +
53
+ `${whose} as ${describe(predicted)}. ${REMEDY}`,
54
+ };
55
+ }
56
+ return {
57
+ outcome: predicted === 2 ? "install" : "merge",
58
+ targetFormat: predicted,
59
+ };
60
+ }
61
+ const actual = input.existingRootFormat;
62
+ if (input.predictedFormat !== undefined &&
63
+ input.predictedFormat !== actual) {
64
+ return {
65
+ outcome: "refuse",
66
+ targetFormat: actual,
67
+ reason: `${exportIs}, and ${whose} came back from the server as ` +
68
+ `${describe(actual)} rather than ${describe(input.predictedFormat)} — ` +
69
+ `the app's rootDocumentFormat changed while this import ran, or a ` +
70
+ `sign-in minted the root first. ${REMEDY}`,
71
+ };
72
+ }
73
+ if (actual !== input.exportFormat) {
74
+ return {
75
+ outcome: "refuse",
76
+ targetFormat: actual,
77
+ reason: `${exportIs}, and ${whose} is ${describe(actual)}. ${REMEDY}`,
78
+ };
79
+ }
80
+ if (!input.overwrite) {
81
+ return {
82
+ outcome: "skip",
83
+ targetFormat: actual,
84
+ reason: actual === 2
85
+ ? `${whose} already exists as a large document; a large-document ` +
86
+ `root export is installed, not merged, and only into a root that ` +
87
+ `holds nothing yet — use --overwrite to install it if the root is ` +
88
+ `still empty`
89
+ : `${whose} already exists; use --overwrite to merge the exported ` +
90
+ `content into it`,
91
+ };
92
+ }
93
+ return { outcome: actual === 2 ? "install" : "merge", targetFormat: actual };
94
+ }
95
+ //# sourceMappingURL=root-import-decision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-import-decision.js","sourceRoot":"","sources":["../../../src/lib/root-import-decision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * The scoped-login request `primitive login --scope …` and
3
+ * `primitive token --scope …` send to `GET /admin/api/oauth-cli` (#3889).
4
+ *
5
+ * One builder serves both commands, so they agree on every rule: a list
6
+ * holding `admin` is a step-up and names the current session as its parent;
7
+ * a step-up is pinned to the environment's app unless `--app` says otherwise
8
+ * (`--app none` asks for an unpinned one); a printed token carries its
9
+ * lifetime. `primitive auth sessions create` builds its CI-session request
10
+ * here too (#3890). Every mistake is a usage error before any browser opens.
11
+ *
12
+ * Pure: the flags, the environment's app id and the stored session's id are
13
+ * arguments.
14
+ */
15
+ /** The five admin scopes. */
16
+ export declare const ADMIN_SCOPES: readonly ["read", "write", "admin", "data:read", "data:write"];
17
+ /** The longest a step-up lives. */
18
+ export declare const STEP_UP_MAX_SECONDS: number;
19
+ /** The longest a token `primitive token` prints lives. */
20
+ export declare const PRINTED_TOKEN_MAX_SECONDS: number;
21
+ /** How long a CI session lives unless `--ttl` says otherwise: 90 days (#3890). */
22
+ export declare const CI_SESSION_DEFAULT_SECONDS: number;
23
+ /** The longest a CI session lives: 1 year. */
24
+ export declare const CI_SESSION_MAX_SECONDS: number;
25
+ /** The longest a CI session's name may be. */
26
+ export declare const CI_SESSION_NAME_MAX_LENGTH = 64;
27
+ /**
28
+ * Seconds in a duration of the `tokens create --ttl` grammar (`15m`, `1h`,
29
+ * `7d`, `6mo`, `1y`), or null when it is not one.
30
+ */
31
+ export declare function parseDurationSeconds(value: string): number | null;
32
+ /** The flags and context one request is built from. */
33
+ export interface ScopeRequestInput {
34
+ /** `sessions` is `primitive auth sessions create`: a CI session (#3890). */
35
+ command: "login" | "token" | "sessions";
36
+ /** `--scope`: a comma-separated list. */
37
+ scope?: string;
38
+ /** `--app`: a comma-separated list, or `none`. */
39
+ app?: string;
40
+ /** `--ttl` (`token` and `sessions` only). */
41
+ ttl?: string;
42
+ /** `--name` (`sessions` only). */
43
+ name?: string;
44
+ /** The environment's app, when the command runs in a project. */
45
+ envAppId?: string;
46
+ /** The stored session's `sid`, when there is one. */
47
+ parentSid?: string;
48
+ /**
49
+ * The stored login a CI session is created from (`sessions` only); null
50
+ * when there is none. Only a login holding a refresh token can prove it is
51
+ * an original login.
52
+ */
53
+ login?: {
54
+ refreshToken: string;
55
+ } | null;
56
+ }
57
+ export type ScopeRequest = {
58
+ ok: true;
59
+ query: Record<string, string> | null;
60
+ stepUp: boolean;
61
+ } | {
62
+ ok: false;
63
+ message: string;
64
+ };
65
+ /**
66
+ * The `oauth-cli` query for a scoped request, null for a plain login, or the
67
+ * usage error that stops the command.
68
+ */
69
+ export declare function buildScopeRequest(input: ScopeRequestInput): ScopeRequest;
@@ -0,0 +1,188 @@
1
+ /**
2
+ * The scoped-login request `primitive login --scope …` and
3
+ * `primitive token --scope …` send to `GET /admin/api/oauth-cli` (#3889).
4
+ *
5
+ * One builder serves both commands, so they agree on every rule: a list
6
+ * holding `admin` is a step-up and names the current session as its parent;
7
+ * a step-up is pinned to the environment's app unless `--app` says otherwise
8
+ * (`--app none` asks for an unpinned one); a printed token carries its
9
+ * lifetime. `primitive auth sessions create` builds its CI-session request
10
+ * here too (#3890). Every mistake is a usage error before any browser opens.
11
+ *
12
+ * Pure: the flags, the environment's app id and the stored session's id are
13
+ * arguments.
14
+ */
15
+ /** The five admin scopes. */
16
+ export const ADMIN_SCOPES = ["read", "write", "admin", "data:read", "data:write"];
17
+ /** The longest a step-up lives. */
18
+ export const STEP_UP_MAX_SECONDS = 15 * 60;
19
+ /** The longest a token `primitive token` prints lives. */
20
+ export const PRINTED_TOKEN_MAX_SECONDS = 60 * 60;
21
+ /** How long a CI session lives unless `--ttl` says otherwise: 90 days (#3890). */
22
+ export const CI_SESSION_DEFAULT_SECONDS = 90 * 86400;
23
+ /** The longest a CI session lives: 1 year. */
24
+ export const CI_SESSION_MAX_SECONDS = 365 * 86400;
25
+ /** The longest a CI session's name may be. */
26
+ export const CI_SESSION_NAME_MAX_LENGTH = 64;
27
+ const UNIT_SECONDS = {
28
+ m: 60,
29
+ min: 60,
30
+ h: 3600,
31
+ d: 86400,
32
+ w: 7 * 86400,
33
+ mo: 30 * 86400,
34
+ y: 365 * 86400,
35
+ };
36
+ /**
37
+ * Seconds in a duration of the `tokens create --ttl` grammar (`15m`, `1h`,
38
+ * `7d`, `6mo`, `1y`), or null when it is not one.
39
+ */
40
+ export function parseDurationSeconds(value) {
41
+ const match = /^(\d+)(mo|min|m|h|d|w|y)$/.exec(value);
42
+ if (!match)
43
+ return null;
44
+ return Number(match[1]) * UNIT_SECONDS[match[2]];
45
+ }
46
+ function usage(message) {
47
+ return { ok: false, message };
48
+ }
49
+ /**
50
+ * The `oauth-cli` query for a scoped request, null for a plain login, or the
51
+ * usage error that stops the command.
52
+ */
53
+ export function buildScopeRequest(input) {
54
+ const { command } = input;
55
+ if (command === "sessions")
56
+ return buildCiSessionRequest(input);
57
+ if (input.scope === undefined) {
58
+ if (input.app !== undefined)
59
+ return usage(`--app needs --scope: primitive ${command} --scope <list> --app <ids>`);
60
+ if (input.ttl !== undefined) {
61
+ return usage(command === "login"
62
+ ? "--ttl applies only to primitive token"
63
+ : "--ttl needs --scope: primitive token --scope <list> --ttl <d>");
64
+ }
65
+ return { ok: true, query: null, stepUp: false };
66
+ }
67
+ if (command === "login" && input.ttl !== undefined) {
68
+ return usage("--ttl applies only to primitive token; a login keeps its usual lifetime");
69
+ }
70
+ const scopes = input.scope.split(",").map((s) => s.trim());
71
+ if (scopes.some((s) => s === "")) {
72
+ return usage(`--scope is a comma-separated list of ${ADMIN_SCOPES.join(", ")}`);
73
+ }
74
+ const unknown = scopes.filter((s) => !ADMIN_SCOPES.includes(s));
75
+ if (unknown.length > 0) {
76
+ return usage(`Unknown scope ${unknown.join(", ")}. Scopes are ${ADMIN_SCOPES.join(", ")}.`);
77
+ }
78
+ const stepUp = scopes.includes("admin");
79
+ if (stepUp && !input.parentSid) {
80
+ return usage("An admin step-up builds on your current login. Run `primitive login` first.");
81
+ }
82
+ let apps;
83
+ if (input.app === "none")
84
+ apps = [];
85
+ else if (input.app !== undefined) {
86
+ // Only `none` unpins: an empty list (an unset `$APP_ID`) or an empty entry
87
+ // must not quietly widen the request to every app.
88
+ apps = input.app.split(",").map((a) => a.trim());
89
+ if (apps.some((a) => a === "")) {
90
+ return usage("--app is a comma-separated list of app ids; pass --app none for an unpinned request");
91
+ }
92
+ }
93
+ else
94
+ apps = stepUp && input.envAppId ? [input.envAppId] : [];
95
+ const query = { scope: scopes.join(",") };
96
+ if (apps.length > 0)
97
+ query.apps = apps.join(",");
98
+ if (stepUp)
99
+ query.parent = input.parentSid;
100
+ query.origin = command;
101
+ if (command === "token") {
102
+ const max = stepUp ? STEP_UP_MAX_SECONDS : PRINTED_TOKEN_MAX_SECONDS;
103
+ let seconds = max;
104
+ if (input.ttl !== undefined) {
105
+ const parsed = parseDurationSeconds(input.ttl);
106
+ if (parsed === null || parsed <= 0) {
107
+ return usage(`Invalid --ttl ${input.ttl}: use a duration such as 15m or 1h`);
108
+ }
109
+ if (parsed > max) {
110
+ return usage(stepUp
111
+ ? `A step-up lives at most 15 minutes; --ttl ${input.ttl} is longer`
112
+ : `A printed token lives at most 1 hour; --ttl ${input.ttl} is longer`);
113
+ }
114
+ seconds = parsed;
115
+ }
116
+ query.ttl = String(seconds);
117
+ }
118
+ return { ok: true, query, stepUp };
119
+ }
120
+ const CREATE_USAGE = "primitive auth sessions create --name <name> --scope <list> --app <ids> [--ttl <d>]";
121
+ /**
122
+ * The `oauth-cli` query of `primitive auth sessions create` (#3890), without
123
+ * the proof the command asks the server for next: a CI session is named,
124
+ * pinned, never holds `admin`, lives 90 days unless `--ttl` says otherwise
125
+ * and a year at most, and is created from a stored login that holds a
126
+ * refresh token. Every mistake is a usage error before any request.
127
+ */
128
+ function buildCiSessionRequest(input) {
129
+ const name = (input.name ?? "").trim();
130
+ if (!name)
131
+ return usage(`--name is required: ${CREATE_USAGE}`);
132
+ if (name.length > CI_SESSION_NAME_MAX_LENGTH) {
133
+ return usage(`--name is at most ${CI_SESSION_NAME_MAX_LENGTH} characters`);
134
+ }
135
+ if (input.scope === undefined)
136
+ return usage(`--scope is required: ${CREATE_USAGE}`);
137
+ const scopes = input.scope.split(",").map((s) => s.trim());
138
+ if (scopes.some((s) => s === "")) {
139
+ return usage(`--scope is a comma-separated list of ${ADMIN_SCOPES.join(", ")}`);
140
+ }
141
+ const unknown = scopes.filter((s) => !ADMIN_SCOPES.includes(s));
142
+ if (unknown.length > 0) {
143
+ return usage(`Unknown scope ${unknown.join(", ")}. Scopes are ${ADMIN_SCOPES.join(", ")}.`);
144
+ }
145
+ if (scopes.includes("admin")) {
146
+ return usage("A CI session never holds admin: drop it from --scope");
147
+ }
148
+ if (input.app === undefined) {
149
+ return usage(`A CI session must be pinned: pass --app <ids>. ${CREATE_USAGE}`);
150
+ }
151
+ if (input.app === "none") {
152
+ return usage("A CI session must be pinned to its apps; --app none is not allowed");
153
+ }
154
+ const apps = input.app.split(",").map((a) => a.trim());
155
+ if (apps.some((a) => a === "")) {
156
+ return usage("--app is a comma-separated list of app ids");
157
+ }
158
+ let seconds = CI_SESSION_DEFAULT_SECONDS;
159
+ if (input.ttl !== undefined) {
160
+ const parsed = parseDurationSeconds(input.ttl);
161
+ if (parsed === null || parsed <= 0) {
162
+ return usage(`Invalid --ttl ${input.ttl}: use a duration such as 30d, 6mo or 1y`);
163
+ }
164
+ if (parsed > CI_SESSION_MAX_SECONDS) {
165
+ return usage(`A CI session lives at most 1 year; --ttl ${input.ttl} is longer`);
166
+ }
167
+ seconds = parsed;
168
+ }
169
+ if (!input.login) {
170
+ return usage("Not logged in. Run `primitive login` first, then create the CI session.");
171
+ }
172
+ if (!input.login.refreshToken) {
173
+ return usage("Your login has no refresh token, so it cannot create CI sessions. Run `primitive login`.");
174
+ }
175
+ return {
176
+ ok: true,
177
+ stepUp: false,
178
+ query: {
179
+ kind: "ci",
180
+ name,
181
+ scope: scopes.join(","),
182
+ apps: apps.join(","),
183
+ origin: "sessions",
184
+ ttl: String(seconds),
185
+ },
186
+ };
187
+ }
188
+ //# sourceMappingURL=scope-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-request.js","sourceRoot":"","sources":["../../../src/lib/scope-request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The admin session a token belongs to: a JWT's `sid` claim, or the session
3
+ * segment of an opaque CI token (`primadm_<sessionId>_<secret>`, #3890).
4
+ * Read without verifying anything; the server is the judge of the token.
5
+ */
6
+ /** Whether `token` is an opaque CI token rather than a JWT. */
7
+ export declare function isCiToken(token: string | undefined | null): boolean;
8
+ /** The session id `token` names, or undefined when it names none. */
9
+ export declare function sessionIdOfToken(token: string | undefined | null): string | undefined;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The admin session a token belongs to: a JWT's `sid` claim, or the session
3
+ * segment of an opaque CI token (`primadm_<sessionId>_<secret>`, #3890).
4
+ * Read without verifying anything; the server is the judge of the token.
5
+ */
6
+ const CI_TOKEN = /^primadm_([0-9A-HJKMNP-TV-Z]{26})_[A-Za-z0-9_-]{43}$/;
7
+ /** Whether `token` is an opaque CI token rather than a JWT. */
8
+ export function isCiToken(token) {
9
+ return typeof token === "string" && token.startsWith("primadm_");
10
+ }
11
+ /** The session id `token` names, or undefined when it names none. */
12
+ export function sessionIdOfToken(token) {
13
+ if (!token)
14
+ return undefined;
15
+ const ci = CI_TOKEN.exec(token);
16
+ if (ci)
17
+ return ci[1];
18
+ if (isCiToken(token))
19
+ return undefined;
20
+ try {
21
+ const payload = JSON.parse(Buffer.from(token.split(".")[1] ?? "", "base64url").toString("utf-8"));
22
+ return typeof payload?.sid === "string" && payload.sid ? payload.sid : undefined;
23
+ }
24
+ catch {
25
+ return undefined;
26
+ }
27
+ }
28
+ //# sourceMappingURL=session-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-id.js","sourceRoot":"","sources":["../../../src/lib/session-id.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,QAAQ,GAAG,sDAAsD,CAAC;AAExE,+DAA+D;AAC/D,MAAM,UAAU,SAAS,CAAC,KAAgC;IACxD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACnE,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,KAAgC;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACtE,CAAC;QACF,OAAO,OAAO,OAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -56,6 +56,13 @@ export interface SnapshotInfo {
56
56
  export declare function createSnapshot(syncDir: string, snapshotsRoot: string, opts?: {
57
57
  auditId?: string;
58
58
  now?: Date;
59
+ /**
60
+ * A machine-local environment's own baseline (#4117). Its tree is shared
61
+ * with a committed environment, so the tree's baseline files are that
62
+ * environment's: they are left out, and this file — when it exists — is
63
+ * carried as the snapshot's `.sync-state.json` instead.
64
+ */
65
+ baselinePath?: string;
59
66
  }): SnapshotResult | null;
60
67
  /**
61
68
  * List snapshots under `snapshotsRoot`, newest-first. Returns an empty array
@@ -89,7 +96,16 @@ export declare function resolveSnapshot(snapshotsRoot: string, id: string | unde
89
96
  * only for the case where the snapshots root sat inside the directory being
90
97
  * replaced.
91
98
  */
92
- export declare function restoreSnapshot(snapshotPath: string, syncDir: string): void;
99
+ export declare function restoreSnapshot(snapshotPath: string, syncDir: string, opts?: {
100
+ /**
101
+ * A machine-local environment's own baseline (#4117). The snapshot's
102
+ * `.sync-state.json` is restored HERE (and this file removed when the
103
+ * snapshot carries none), never into the shared tree; the tree's own
104
+ * baseline files — the committed environment's — come through the swap
105
+ * exactly as they are, present or absent.
106
+ */
107
+ baselinePath?: string;
108
+ }): void;
93
109
  /**
94
110
  * Prune snapshots older than `retentionDays` from `snapshotsRoot`. Only the
95
111
  * given slot is touched (cross-slot retention is independent — each slot has
@@ -24,6 +24,14 @@
24
24
  */
25
25
  import { existsSync, readdirSync, statSync, writeFileSync, readFileSync, cpSync, rmSync, renameSync, mkdirSync, } from "fs";
26
26
  import { join, dirname } from "path";
27
+ import { LEGACY_SYNC_STATE_FILENAME, SYNC_STATE_FILENAME } from "./sync-paths.js";
28
+ /**
29
+ * The two names a committed environment's baseline has in its tree: the
30
+ * current one and the pre-#3153 one still read (#3392).
31
+ */
32
+ const TREE_BASELINE_NAMES = [SYNC_STATE_FILENAME, LEGACY_SYNC_STATE_FILENAME];
33
+ /** The name a snapshot carries its baseline under. */
34
+ const SNAPSHOT_BASELINE_NAME = SYNC_STATE_FILENAME;
27
35
  /** Marker file written LAST inside a snapshot to prove it completed. */
28
36
  export const SNAPSHOT_COMPLETE_MARKER = ".snapshot-complete";
29
37
  /** Cross-link to the audit entry that produced the snapshot (Phase 2). */
@@ -86,7 +94,21 @@ export function createSnapshot(syncDir, snapshotsRoot, opts = {}) {
86
94
  mkdirSync(snapshotsRoot, { recursive: true });
87
95
  // Full recursive copy. `dereference: false` keeps symlinks from being
88
96
  // silently followed (edge case: symlinks inside the sync tree).
89
- cpSync(syncDir, finalDest, { recursive: true, dereference: false });
97
+ const baselinePath = opts.baselinePath;
98
+ if (baselinePath === undefined) {
99
+ cpSync(syncDir, finalDest, { recursive: true, dereference: false });
100
+ }
101
+ else {
102
+ const skipped = new Set(TREE_BASELINE_NAMES.map((name) => join(syncDir, name)));
103
+ cpSync(syncDir, finalDest, {
104
+ recursive: true,
105
+ dereference: false,
106
+ filter: (source) => !skipped.has(source),
107
+ });
108
+ if (existsSync(baselinePath)) {
109
+ cpSync(baselinePath, join(finalDest, SNAPSHOT_BASELINE_NAME));
110
+ }
111
+ }
90
112
  if (opts.auditId) {
91
113
  writeFileSync(join(finalDest, SNAPSHOT_AUDIT_ID_MARKER), opts.auditId);
92
114
  }
@@ -208,7 +230,7 @@ export function resolveSnapshot(snapshotsRoot, id, minPrefix = 8) {
208
230
  * only for the case where the snapshots root sat inside the directory being
209
231
  * replaced.
210
232
  */
211
- export function restoreSnapshot(snapshotPath, syncDir) {
233
+ export function restoreSnapshot(snapshotPath, syncDir, opts = {}) {
212
234
  if (!existsSync(snapshotPath)) {
213
235
  throw new Error(`Snapshot not found: ${snapshotPath}`);
214
236
  }
@@ -230,6 +252,23 @@ export function restoreSnapshot(snapshotPath, syncDir) {
230
252
  rmSync(markerPath, { force: true });
231
253
  }
232
254
  }
255
+ // A machine-local environment's baseline is not part of the tree: set it
256
+ // aside, and carry the committed environment's baseline names across the
257
+ // swap exactly as the live tree holds them.
258
+ const baselinePath = opts.baselinePath;
259
+ let snapshotBaseline = null;
260
+ if (baselinePath !== undefined) {
261
+ const staged = join(stageDir, SNAPSHOT_BASELINE_NAME);
262
+ if (existsSync(staged))
263
+ snapshotBaseline = readFileSync(staged);
264
+ for (const name of TREE_BASELINE_NAMES) {
265
+ const live = join(syncDir, name);
266
+ const stagedName = join(stageDir, name);
267
+ rmSync(stagedName, { force: true });
268
+ if (existsSync(live))
269
+ cpSync(live, stagedName);
270
+ }
271
+ }
233
272
  // Atomic-ish swap: move the live dir aside, move staging into place, then
234
273
  // delete the old dir. Same-filesystem renames are atomic.
235
274
  if (existsSync(syncDir)) {
@@ -255,6 +294,15 @@ export function restoreSnapshot(snapshotPath, syncDir) {
255
294
  if (existsSync(oldDir)) {
256
295
  rmSync(oldDir, { recursive: true, force: true });
257
296
  }
297
+ if (baselinePath !== undefined) {
298
+ if (snapshotBaseline) {
299
+ mkdirSync(dirname(baselinePath), { recursive: true });
300
+ writeFileSync(baselinePath, snapshotBaseline);
301
+ }
302
+ else {
303
+ rmSync(baselinePath, { force: true });
304
+ }
305
+ }
258
306
  }
259
307
  finally {
260
308
  // Clean up any leftover staging/old dirs on failure.
@@ -1 +1 @@
1
- {"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../../src/lib/snapshots.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../../src/lib/snapshots.ts"],"names":[],"mappings":"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"}