bkper 4.24.2 → 4.24.3

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 (82) hide show
  1. package/lib/agent/extensions/builtins.d.ts.map +1 -1
  2. package/lib/agent/extensions/builtins.js +2 -2
  3. package/lib/agent/extensions/builtins.js.map +1 -1
  4. package/lib/agent/extensions/handoff.d.ts +2 -13
  5. package/lib/agent/extensions/handoff.d.ts.map +1 -1
  6. package/lib/agent/extensions/handoff.js +37 -17
  7. package/lib/agent/extensions/handoff.js.map +1 -1
  8. package/lib/agent/interactive/interactive-mode.d.ts.map +1 -1
  9. package/lib/agent/interactive/interactive-mode.js +1 -10
  10. package/lib/agent/interactive/interactive-mode.js.map +1 -1
  11. package/lib/commands/apps/deploy.d.ts +3 -1
  12. package/lib/commands/apps/deploy.d.ts.map +1 -1
  13. package/lib/commands/apps/deploy.js +29 -4
  14. package/lib/commands/apps/deploy.js.map +1 -1
  15. package/lib/commands/apps/git/clone.d.ts +23 -0
  16. package/lib/commands/apps/git/clone.d.ts.map +1 -0
  17. package/lib/commands/apps/git/clone.js +161 -0
  18. package/lib/commands/apps/git/clone.js.map +1 -0
  19. package/lib/commands/apps/git/credentials.d.ts +35 -0
  20. package/lib/commands/apps/git/credentials.d.ts.map +1 -0
  21. package/lib/commands/apps/git/credentials.js +196 -0
  22. package/lib/commands/apps/git/credentials.js.map +1 -0
  23. package/lib/commands/apps/git/index.d.ts +12 -0
  24. package/lib/commands/apps/git/index.d.ts.map +1 -0
  25. package/lib/commands/apps/git/index.js +12 -0
  26. package/lib/commands/apps/git/index.js.map +1 -0
  27. package/lib/commands/apps/git/inspect.d.ts +26 -0
  28. package/lib/commands/apps/git/inspect.d.ts.map +1 -0
  29. package/lib/commands/apps/git/inspect.js +207 -0
  30. package/lib/commands/apps/git/inspect.js.map +1 -0
  31. package/lib/commands/apps/git/markers.d.ts +16 -0
  32. package/lib/commands/apps/git/markers.d.ts.map +1 -0
  33. package/lib/commands/apps/git/markers.js +125 -0
  34. package/lib/commands/apps/git/markers.js.map +1 -0
  35. package/lib/commands/apps/git/mode.d.ts +25 -0
  36. package/lib/commands/apps/git/mode.d.ts.map +1 -0
  37. package/lib/commands/apps/git/mode.js +106 -0
  38. package/lib/commands/apps/git/mode.js.map +1 -0
  39. package/lib/commands/apps/git/platform-source.d.ts +18 -0
  40. package/lib/commands/apps/git/platform-source.d.ts.map +1 -0
  41. package/lib/commands/apps/git/platform-source.js +151 -0
  42. package/lib/commands/apps/git/platform-source.js.map +1 -0
  43. package/lib/commands/apps/git/preflight.d.ts +21 -0
  44. package/lib/commands/apps/git/preflight.d.ts.map +1 -0
  45. package/lib/commands/apps/git/preflight.js +130 -0
  46. package/lib/commands/apps/git/preflight.js.map +1 -0
  47. package/lib/commands/apps/git/push.d.ts +22 -0
  48. package/lib/commands/apps/git/push.d.ts.map +1 -0
  49. package/lib/commands/apps/git/push.js +107 -0
  50. package/lib/commands/apps/git/push.js.map +1 -0
  51. package/lib/commands/apps/git/remote.d.ts +7 -0
  52. package/lib/commands/apps/git/remote.d.ts.map +1 -0
  53. package/lib/commands/apps/git/remote.js +48 -0
  54. package/lib/commands/apps/git/remote.js.map +1 -0
  55. package/lib/commands/apps/git/run-git.d.ts +17 -0
  56. package/lib/commands/apps/git/run-git.d.ts.map +1 -0
  57. package/lib/commands/apps/git/run-git.js +61 -0
  58. package/lib/commands/apps/git/run-git.js.map +1 -0
  59. package/lib/commands/apps/git/types.d.ts +95 -0
  60. package/lib/commands/apps/git/types.d.ts.map +1 -0
  61. package/lib/commands/apps/git/types.js +17 -0
  62. package/lib/commands/apps/git/types.js.map +1 -0
  63. package/lib/commands/apps/index.d.ts +2 -0
  64. package/lib/commands/apps/index.d.ts.map +1 -1
  65. package/lib/commands/apps/index.js +3 -0
  66. package/lib/commands/apps/index.js.map +1 -1
  67. package/lib/commands/apps/init.d.ts.map +1 -1
  68. package/lib/commands/apps/init.js +19 -3
  69. package/lib/commands/apps/init.js.map +1 -1
  70. package/lib/commands/apps/register.d.ts.map +1 -1
  71. package/lib/commands/apps/register.js +23 -4
  72. package/lib/commands/apps/register.js.map +1 -1
  73. package/lib/commands/apps/source-workflow.d.ts +32 -0
  74. package/lib/commands/apps/source-workflow.d.ts.map +1 -0
  75. package/lib/commands/apps/source-workflow.js +170 -0
  76. package/lib/commands/apps/source-workflow.js.map +1 -0
  77. package/lib/commands/apps/sync.d.ts.map +1 -1
  78. package/lib/commands/apps/sync.js +13 -8
  79. package/lib/commands/apps/sync.js.map +1 -1
  80. package/lib/docs/cli/app-management.md +94 -6
  81. package/lib/docs/index.md +1 -1
  82. package/package.json +1 -1
@@ -0,0 +1,207 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ import { runGit } from './run-git.js';
13
+ import { ARTIFACTS_HOST_SUFFIX, ManagedGitError, } from './types.js';
14
+ export function isArtifactsRemoteUrl(url) {
15
+ try {
16
+ const parsed = new URL(url);
17
+ if (parsed.protocol !== 'https:') {
18
+ return false;
19
+ }
20
+ return (parsed.hostname === 'artifacts.cloudflare.net' ||
21
+ parsed.hostname.endsWith(ARTIFACTS_HOST_SUFFIX));
22
+ }
23
+ catch (_a) {
24
+ // SCP-like or malformed URLs are never Artifacts HTTPS remotes.
25
+ return false;
26
+ }
27
+ }
28
+ export function normalizeRemoteUrl(url) {
29
+ return url.replace(/\/+$/, '');
30
+ }
31
+ export function remoteUrlsEqual(left, right) {
32
+ return normalizeRemoteUrl(left) === normalizeRemoteUrl(right);
33
+ }
34
+ /**
35
+ * Resolves the Git repository root for a path, or null when outside a repo.
36
+ */
37
+ export function findGitRoot(startDir_1) {
38
+ return __awaiter(this, arguments, void 0, function* (startDir, runner = runGit) {
39
+ const result = yield runner(['rev-parse', '--show-toplevel'], {
40
+ cwd: startDir,
41
+ allowFailure: true,
42
+ });
43
+ if (result.exitCode !== 0) {
44
+ return null;
45
+ }
46
+ const root = result.stdout.trim();
47
+ return root ? path.resolve(root) : null;
48
+ });
49
+ }
50
+ export function findBkperYaml(dir) {
51
+ const yamlPath = path.join(dir, 'bkper.yaml');
52
+ if (fs.existsSync(yamlPath)) {
53
+ return yamlPath;
54
+ }
55
+ const jsonPath = path.join(dir, 'bkper.json');
56
+ if (fs.existsSync(jsonPath)) {
57
+ return jsonPath;
58
+ }
59
+ return null;
60
+ }
61
+ export function listRemotes(repoRoot_1) {
62
+ return __awaiter(this, arguments, void 0, function* (repoRoot, runner = runGit) {
63
+ const result = yield runner(['remote', '-v'], {
64
+ cwd: repoRoot,
65
+ allowFailure: true,
66
+ });
67
+ if (result.exitCode !== 0 || !result.stdout.trim()) {
68
+ return [];
69
+ }
70
+ const byName = new Map();
71
+ for (const line of result.stdout.split('\n')) {
72
+ const match = /^(\S+)\s+(\S+)\s+\((fetch|push)\)$/.exec(line.trim());
73
+ if (!match) {
74
+ continue;
75
+ }
76
+ const [, name, url] = match;
77
+ if (!byName.has(name)) {
78
+ byName.set(name, {
79
+ name,
80
+ url,
81
+ isArtifacts: isArtifactsRemoteUrl(url),
82
+ });
83
+ }
84
+ }
85
+ return [...byName.values()];
86
+ });
87
+ }
88
+ export function hasExternalRemote(remotes) {
89
+ return remotes.some(remote => !remote.isArtifacts);
90
+ }
91
+ export function getOriginRemote(remotes) {
92
+ return remotes.find(remote => remote.name === 'origin');
93
+ }
94
+ export function getCurrentBranch(repoRoot_1) {
95
+ return __awaiter(this, arguments, void 0, function* (repoRoot, runner = runGit) {
96
+ const symbolic = yield runner(['symbolic-ref', '--quiet', '--short', 'HEAD'], {
97
+ cwd: repoRoot,
98
+ allowFailure: true,
99
+ });
100
+ if (symbolic.exitCode === 0 && symbolic.stdout.trim()) {
101
+ return { branch: symbolic.stdout.trim(), detached: false };
102
+ }
103
+ return { branch: null, detached: true };
104
+ });
105
+ }
106
+ export function getHeadSha(repoRoot_1) {
107
+ return __awaiter(this, arguments, void 0, function* (repoRoot, runner = runGit) {
108
+ const result = yield runner(['rev-parse', '--verify', 'HEAD'], {
109
+ cwd: repoRoot,
110
+ allowFailure: true,
111
+ });
112
+ if (result.exitCode !== 0) {
113
+ return null;
114
+ }
115
+ const sha = result.stdout.trim();
116
+ return sha || null;
117
+ });
118
+ }
119
+ export function getWorkingTreeStatus(repoRoot_1) {
120
+ return __awaiter(this, arguments, void 0, function* (repoRoot, runner = runGit) {
121
+ var _a, _b;
122
+ const result = yield runner(['status', '--porcelain=v1', '-uall'], {
123
+ cwd: repoRoot,
124
+ });
125
+ const staged = [];
126
+ const modified = [];
127
+ const untracked = [];
128
+ for (const line of result.stdout.split('\n')) {
129
+ if (!line) {
130
+ continue;
131
+ }
132
+ const indexStatus = (_a = line[0]) !== null && _a !== void 0 ? _a : ' ';
133
+ const workTreeStatus = (_b = line[1]) !== null && _b !== void 0 ? _b : ' ';
134
+ const filePath = line.slice(3).trim();
135
+ if (!filePath) {
136
+ continue;
137
+ }
138
+ if (indexStatus === '?' && workTreeStatus === '?') {
139
+ untracked.push(filePath);
140
+ continue;
141
+ }
142
+ if (indexStatus !== ' ' && indexStatus !== '?') {
143
+ staged.push(filePath);
144
+ }
145
+ if (workTreeStatus !== ' ' && workTreeStatus !== '?') {
146
+ modified.push(filePath);
147
+ }
148
+ }
149
+ return {
150
+ clean: staged.length === 0 && modified.length === 0 && untracked.length === 0,
151
+ staged,
152
+ modified,
153
+ untracked,
154
+ };
155
+ });
156
+ }
157
+ /**
158
+ * Inspects the Git repository surrounding an app directory.
159
+ */
160
+ export function inspectGitRepository(appDir_1) {
161
+ return __awaiter(this, arguments, void 0, function* (appDir, runner = runGit) {
162
+ const root = yield findGitRoot(appDir, runner);
163
+ if (!root) {
164
+ return null;
165
+ }
166
+ const bkperYamlPath = findBkperYaml(appDir);
167
+ const resolvedAppDir = path.resolve(appDir);
168
+ const isNestedApp = bkperYamlPath !== null && path.resolve(path.dirname(bkperYamlPath)) !== root;
169
+ const [{ branch, detached }, head, remotes] = yield Promise.all([
170
+ getCurrentBranch(root, runner),
171
+ getHeadSha(root, runner),
172
+ listRemotes(root, runner),
173
+ ]);
174
+ return {
175
+ root,
176
+ branch,
177
+ head,
178
+ detached,
179
+ hasCommits: head !== null,
180
+ remotes,
181
+ isNestedApp,
182
+ bkperYamlPath,
183
+ };
184
+ });
185
+ }
186
+ export function ensureGitInitialized(targetDir_1) {
187
+ return __awaiter(this, arguments, void 0, function* (targetDir, runner = runGit) {
188
+ const existingRoot = yield findGitRoot(targetDir, runner);
189
+ if (existingRoot) {
190
+ return false;
191
+ }
192
+ yield runner(['init', '-b', 'main'], { cwd: targetDir });
193
+ return true;
194
+ });
195
+ }
196
+ export function requireGitRepository(info) {
197
+ if (!info) {
198
+ throw new ManagedGitError('NO_GIT_REPOSITORY', [
199
+ 'No Git repository found for this App.',
200
+ 'Initialize one at the App root, for example:',
201
+ ' git init -b main',
202
+ ' git add .',
203
+ ' git commit -m "Initial app"',
204
+ ].join('\n'));
205
+ }
206
+ }
207
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../../src/commands/apps/git/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type SourceMarker } from './types.js';
2
+ export declare function getSourceMarkerPath(repoRoot: string): string;
3
+ export declare function isUuidV4(value: string): boolean;
4
+ export declare function createActivationId(): string;
5
+ export declare function readSourceMarker(repoRoot: string): SourceMarker | null;
6
+ /**
7
+ * Creates or returns the existing pending activation marker.
8
+ * Does not overwrite a managed marker.
9
+ */
10
+ export declare function ensurePendingSourceMarker(repoRoot: string): SourceMarker & {
11
+ state: 'pending';
12
+ };
13
+ export declare function writeManagedSourceMarker(repoRoot: string, appId: string, remote: string): SourceMarker & {
14
+ state: 'managed';
15
+ };
16
+ //# sourceMappingURL=markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../../../src/commands/apps/git/markers.ts"],"names":[],"mappings":"AAGA,OAAO,EAIH,KAAK,YAAY,EACpB,MAAM,YAAY,CAAC;AAKpB,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAqED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAMtE;AAiCD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG;IACxE,KAAK,EAAE,SAAS,CAAC;CACpB,CAkBA;AAED,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACf,YAAY,GAAG;IAAC,KAAK,EAAE,SAAS,CAAA;CAAC,CASnC"}
@@ -0,0 +1,125 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { randomUUID } from 'crypto';
4
+ import { ManagedGitError, SOURCE_MARKER_DIR, SOURCE_MARKER_FILE, } from './types.js';
5
+ const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
6
+ export function getSourceMarkerPath(repoRoot) {
7
+ return path.join(repoRoot, SOURCE_MARKER_DIR, SOURCE_MARKER_FILE);
8
+ }
9
+ export function isUuidV4(value) {
10
+ return UUID_V4_RE.test(value);
11
+ }
12
+ export function createActivationId() {
13
+ return randomUUID();
14
+ }
15
+ function parseSourceMarker(raw) {
16
+ let parsed;
17
+ try {
18
+ parsed = JSON.parse(raw);
19
+ }
20
+ catch (_a) {
21
+ throw new ManagedGitError('SOURCE_MARKER_INVALID', 'The local managed-source marker is malformed. Inspect .bkper/source-marker.json and restore a valid pending or managed marker before retrying.');
22
+ }
23
+ if (!parsed || typeof parsed !== 'object') {
24
+ throw new ManagedGitError('SOURCE_MARKER_INVALID', 'The local managed-source marker is malformed.');
25
+ }
26
+ const marker = parsed;
27
+ if (marker.version !== 1) {
28
+ throw new ManagedGitError('SOURCE_MARKER_INVALID', 'Unsupported managed-source marker version.');
29
+ }
30
+ if (marker.state === 'pending') {
31
+ if (typeof marker.activationId !== 'string' || !isUuidV4(marker.activationId)) {
32
+ throw new ManagedGitError('SOURCE_MARKER_INVALID', 'The pending managed-source marker must contain a lowercase UUID v4 activationId.');
33
+ }
34
+ return {
35
+ version: 1,
36
+ state: 'pending',
37
+ activationId: marker.activationId,
38
+ };
39
+ }
40
+ if (marker.state === 'managed') {
41
+ if (typeof marker.appId !== 'string' || marker.appId.length === 0) {
42
+ throw new ManagedGitError('SOURCE_MARKER_INVALID', 'The managed-source marker is missing appId.');
43
+ }
44
+ if (typeof marker.remote !== 'string' || marker.remote.length === 0) {
45
+ throw new ManagedGitError('SOURCE_MARKER_INVALID', 'The managed-source marker is missing remote.');
46
+ }
47
+ return {
48
+ version: 1,
49
+ state: 'managed',
50
+ appId: marker.appId,
51
+ remote: marker.remote,
52
+ };
53
+ }
54
+ throw new ManagedGitError('SOURCE_MARKER_INVALID', 'The local managed-source marker has an unknown state.');
55
+ }
56
+ export function readSourceMarker(repoRoot) {
57
+ const markerPath = getSourceMarkerPath(repoRoot);
58
+ if (!fs.existsSync(markerPath)) {
59
+ return null;
60
+ }
61
+ return parseSourceMarker(fs.readFileSync(markerPath, 'utf8'));
62
+ }
63
+ function resolveGitDirectory(repoRoot) {
64
+ const dotGit = path.join(repoRoot, '.git');
65
+ if (!fs.existsSync(dotGit))
66
+ return null;
67
+ if (fs.statSync(dotGit).isDirectory())
68
+ return dotGit;
69
+ const match = /^gitdir:\s*(.+)$/m.exec(fs.readFileSync(dotGit, 'utf8'));
70
+ return match ? path.resolve(repoRoot, match[1]) : null;
71
+ }
72
+ function excludeSourceMarker(repoRoot) {
73
+ const gitDir = resolveGitDirectory(repoRoot);
74
+ if (!gitDir)
75
+ return;
76
+ const infoDir = path.join(gitDir, 'info');
77
+ const excludePath = path.join(infoDir, 'exclude');
78
+ const pattern = `/${SOURCE_MARKER_DIR}/${SOURCE_MARKER_FILE}`;
79
+ fs.mkdirSync(infoDir, { recursive: true });
80
+ const existing = fs.existsSync(excludePath) ? fs.readFileSync(excludePath, 'utf8') : '';
81
+ if (existing.split(/\r?\n/).includes(pattern))
82
+ return;
83
+ const separator = existing.length > 0 && !existing.endsWith('\n') ? '\n' : '';
84
+ fs.appendFileSync(excludePath, `${separator}${pattern}\n`, 'utf8');
85
+ }
86
+ function writeMarkerAtomic(repoRoot, marker) {
87
+ excludeSourceMarker(repoRoot);
88
+ const dir = path.join(repoRoot, SOURCE_MARKER_DIR);
89
+ fs.mkdirSync(dir, { recursive: true });
90
+ const markerPath = getSourceMarkerPath(repoRoot);
91
+ const tempPath = `${markerPath}.${process.pid}.tmp`;
92
+ fs.writeFileSync(tempPath, `${JSON.stringify(marker, null, 2)}\n`, 'utf8');
93
+ fs.renameSync(tempPath, markerPath);
94
+ }
95
+ /**
96
+ * Creates or returns the existing pending activation marker.
97
+ * Does not overwrite a managed marker.
98
+ */
99
+ export function ensurePendingSourceMarker(repoRoot) {
100
+ const existing = readSourceMarker(repoRoot);
101
+ if ((existing === null || existing === void 0 ? void 0 : existing.state) === 'pending') {
102
+ return existing;
103
+ }
104
+ if ((existing === null || existing === void 0 ? void 0 : existing.state) === 'managed') {
105
+ throw new ManagedGitError('SOURCE_MARKER_INVALID', 'A managed-source marker already exists for this repository. Do not create a pending activation marker over it.');
106
+ }
107
+ const marker = {
108
+ version: 1,
109
+ state: 'pending',
110
+ activationId: createActivationId(),
111
+ };
112
+ writeMarkerAtomic(repoRoot, marker);
113
+ return marker;
114
+ }
115
+ export function writeManagedSourceMarker(repoRoot, appId, remote) {
116
+ const marker = {
117
+ version: 1,
118
+ state: 'managed',
119
+ appId,
120
+ remote,
121
+ };
122
+ writeMarkerAtomic(repoRoot, marker);
123
+ return marker;
124
+ }
125
+ //# sourceMappingURL=markers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.js","sourceRoot":"","sources":["../../../../src/commands/apps/git/markers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAC,UAAU,EAAC,MAAM,QAAQ,CAAC;AAClC,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,kBAAkB,GAErB,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,GACZ,uEAAuE,CAAC;AAE5E,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IAClC,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAC9B,OAAO,UAAU,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IAClC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,WAAM,CAAC;QACL,MAAM,IAAI,eAAe,CACrB,uBAAuB,EACvB,gJAAgJ,CACnJ,CAAC;IACN,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,eAAe,CACrB,uBAAuB,EACvB,+CAA+C,CAClD,CAAC;IACN,CAAC;IAED,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,eAAe,CACrB,uBAAuB,EACvB,4CAA4C,CAC/C,CAAC;IACN,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,eAAe,CACrB,uBAAuB,EACvB,kFAAkF,CACrF,CAAC;QACN,CAAC;QACD,OAAO;YACH,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,MAAM,CAAC,YAAY;SACpC,CAAC;IACN,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,eAAe,CACrB,uBAAuB,EACvB,6CAA6C,CAChD,CAAC;QACN,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,eAAe,CACrB,uBAAuB,EACvB,8CAA8C,CACjD,CAAC;QACN,CAAC;QACD,OAAO;YACH,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACxB,CAAC;IACN,CAAC;IAED,MAAM,IAAI,eAAe,CACrB,uBAAuB,EACvB,uDAAuD,CAC1D,CAAC;AACN,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC7C,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,iBAAiB,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;QAAE,OAAO,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IACzC,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,iBAAiB,IAAI,kBAAkB,EAAE,CAAC;IAC9D,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO;IACtD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,SAAS,GAAG,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,MAAoB;IAC7D,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IACnD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACpD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3E,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IAGtD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,MAAK,SAAS,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,MAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,eAAe,CACrB,uBAAuB,EACvB,gHAAgH,CACnH,CAAC;IACN,CAAC;IACD,MAAM,MAAM,GAAiB;QACzB,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,kBAAkB,EAAE;KACrC,CAAC;IACF,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACpC,QAAgB,EAChB,KAAa,EACb,MAAc;IAEd,MAAM,MAAM,GAAiB;QACzB,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,SAAS;QAChB,KAAK;QACL,MAAM;KACT,CAAC;IACF,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type GitRunner } from './run-git.js';
2
+ import type { ManagedSourcePlatformStatus, SourceModeDecision } from './types.js';
3
+ export interface DetectSourceModeInput {
4
+ appDir: string;
5
+ appId: string;
6
+ /** Platform managed-source status when available. Null means not fetched. */
7
+ platformStatus: ManagedSourcePlatformStatus | null;
8
+ /** True when Core already has this App id. */
9
+ coreAppExists: boolean;
10
+ /** True when Platform reports managed-source feature disabled. */
11
+ featureDisabled?: boolean;
12
+ runner?: GitRunner;
13
+ }
14
+ /**
15
+ * Deterministic source-mode detection.
16
+ *
17
+ * Order:
18
+ * 1. Platform managed record
19
+ * 2. Pending local marker (never downgrade on transient miss)
20
+ * 3. Nested monorepo / external remote / missing git root
21
+ * 4. Existing Core App without pending marker stays external
22
+ * 5. New standalone eligible App activates managed source
23
+ */
24
+ export declare function detectSourceMode(input: DetectSourceModeInput): Promise<SourceModeDecision>;
25
+ //# sourceMappingURL=mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../../../../src/commands/apps/git/mode.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,KAAK,SAAS,EAAC,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EACR,2BAA2B,EAC3B,kBAAkB,EACrB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,cAAc,EAAE,2BAA2B,GAAG,IAAI,CAAC;IACnD,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,kEAAkE;IAClE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAClC,KAAK,EAAE,qBAAqB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAwF7B"}
@@ -0,0 +1,106 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import path from 'path';
11
+ import { hasExternalRemote, inspectGitRepository } from './inspect.js';
12
+ import { readSourceMarker } from './markers.js';
13
+ import { runGit } from './run-git.js';
14
+ /**
15
+ * Deterministic source-mode detection.
16
+ *
17
+ * Order:
18
+ * 1. Platform managed record
19
+ * 2. Pending local marker (never downgrade on transient miss)
20
+ * 3. Nested monorepo / external remote / missing git root
21
+ * 4. Existing Core App without pending marker stays external
22
+ * 5. New standalone eligible App activates managed source
23
+ */
24
+ export function detectSourceMode(input) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ var _a, _b, _c, _d;
27
+ const runner = (_a = input.runner) !== null && _a !== void 0 ? _a : runGit;
28
+ if (((_b = input.platformStatus) === null || _b === void 0 ? void 0 : _b.mode) === 'managed') {
29
+ return {
30
+ mode: 'managed',
31
+ reason: 'platform_record',
32
+ appId: input.platformStatus.appId,
33
+ };
34
+ }
35
+ const repo = yield inspectGitRepository(input.appDir, runner);
36
+ if (!repo) {
37
+ return { mode: 'external', reason: 'no_git' };
38
+ }
39
+ const marker = readSourceMarker(repo.root);
40
+ if ((marker === null || marker === void 0 ? void 0 : marker.state) === 'pending') {
41
+ return {
42
+ mode: 'managed',
43
+ reason: 'pending_marker',
44
+ appId: input.appId,
45
+ activationId: marker.activationId,
46
+ };
47
+ }
48
+ if ((marker === null || marker === void 0 ? void 0 : marker.state) === 'managed') {
49
+ return {
50
+ mode: 'managed',
51
+ reason: 'platform_record',
52
+ appId: marker.appId,
53
+ remote: marker.remote,
54
+ };
55
+ }
56
+ if (input.featureDisabled) {
57
+ return { mode: 'external', reason: 'feature_disabled' };
58
+ }
59
+ if (repo.isNestedApp) {
60
+ return {
61
+ mode: 'external',
62
+ reason: 'nested_app',
63
+ details: (_c = repo.bkperYamlPath) !== null && _c !== void 0 ? _c : undefined,
64
+ };
65
+ }
66
+ const bkperDir = repo.bkperYamlPath
67
+ ? path.dirname(path.resolve(repo.bkperYamlPath))
68
+ : path.resolve(input.appDir);
69
+ if (bkperDir !== repo.root) {
70
+ return {
71
+ mode: 'external',
72
+ reason: 'not_git_root',
73
+ details: repo.root,
74
+ };
75
+ }
76
+ if (hasExternalRemote(repo.remotes)) {
77
+ const external = repo.remotes
78
+ .filter(remote => !remote.isArtifacts)
79
+ .map(remote => `${remote.name}=${remote.url}`)
80
+ .join(', ');
81
+ return {
82
+ mode: 'external',
83
+ reason: 'external_remote',
84
+ details: external,
85
+ };
86
+ }
87
+ if (input.coreAppExists) {
88
+ return { mode: 'external', reason: 'existing_core_app' };
89
+ }
90
+ if (((_d = input.platformStatus) === null || _d === void 0 ? void 0 : _d.mode) === 'external') {
91
+ // Eligible new App: local shape already checked.
92
+ return {
93
+ mode: 'activate_managed',
94
+ reason: 'new_standalone_app',
95
+ appId: input.appId,
96
+ };
97
+ }
98
+ // No platform status available and local shape is eligible for activation.
99
+ return {
100
+ mode: 'activate_managed',
101
+ reason: 'new_standalone_app',
102
+ appId: input.appId,
103
+ };
104
+ });
105
+ }
106
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../../../../src/commands/apps/git/mode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ManagedSourceActivationResult, type ManagedSourceCredential, type ManagedSourcePlatformStatus } from './types.js';
2
+ export interface PlatformSourceApi {
3
+ getStatus(appId: string): Promise<ManagedSourcePlatformStatus | 'feature_disabled' | 'app_not_found'>;
4
+ activate(appId: string, activationId: string): Promise<ManagedSourceActivationResult>;
5
+ issueCredential(appId: string, scope: 'read' | 'write'): Promise<ManagedSourceCredential>;
6
+ }
7
+ export declare function createPlatformSourceApi(): PlatformSourceApi;
8
+ /**
9
+ * Ensures the platform client module remains the auth base for non-source routes.
10
+ * Source operations keep a small fetch wrapper for explicit no-store and token-redaction handling.
11
+ */
12
+ export declare function getPlatformBaseUrl(): string;
13
+ /**
14
+ * Strips provider query suffixes from repository tokens before handing them to Git.
15
+ * Never log the returned secret.
16
+ */
17
+ export declare function stripRepositoryTokenSecret(token: string): string;
18
+ //# sourceMappingURL=platform-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-source.d.ts","sourceRoot":"","sources":["../../../../src/commands/apps/git/platform-source.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EACnC,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,iBAAiB;IAC9B,SAAS,CACL,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,2BAA2B,GAAG,kBAAkB,GAAG,eAAe,CAAC,CAAC;IAC/E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACtF,eAAe,CACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,OAAO,GACxB,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACvC;AAyGD,wBAAgB,uBAAuB,IAAI,iBAAiB,CAuF3D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhE"}