@mnemonik/cli 7.109.3 → 7.110.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 (104) hide show
  1. package/dist/auth/credentials.js +297 -36
  2. package/dist/auth/index.d.ts +2 -0
  3. package/dist/auth/index.d.ts.map +1 -1
  4. package/dist/auth/index.js +1914 -19
  5. package/dist/auth/index.js.map +1 -1
  6. package/dist/auth/machineName.d.ts +8 -0
  7. package/dist/auth/machineName.d.ts.map +1 -0
  8. package/dist/auth/machineName.js +23 -0
  9. package/dist/auth/machineName.js.map +1 -0
  10. package/dist/consent.d.ts +29 -0
  11. package/dist/consent.d.ts.map +1 -0
  12. package/dist/consent.js +87 -0
  13. package/dist/consent.js.map +1 -0
  14. package/dist/diagnostics.js +301 -40
  15. package/dist/digests.json +102 -90
  16. package/dist/help.d.ts.map +1 -1
  17. package/dist/help.js +59 -44
  18. package/dist/help.js.map +1 -1
  19. package/dist/humanReason.d.ts +8 -0
  20. package/dist/humanReason.d.ts.map +1 -1
  21. package/dist/humanReason.js +44 -16
  22. package/dist/humanReason.js.map +1 -1
  23. package/dist/identity/migrate.js +1835 -44
  24. package/dist/install/hosts.d.ts +2 -0
  25. package/dist/install/hosts.d.ts.map +1 -1
  26. package/dist/install/hosts.js +23 -14
  27. package/dist/install/hosts.js.map +1 -1
  28. package/dist/install/journal.js +124 -11
  29. package/dist/install/journey.d.ts +20 -0
  30. package/dist/install/journey.d.ts.map +1 -1
  31. package/dist/install/journey.js +1913 -82
  32. package/dist/install/journey.js.map +1 -1
  33. package/dist/install/ownership.d.ts.map +1 -1
  34. package/dist/install/ownership.js +1818 -10
  35. package/dist/install/ownership.js.map +1 -1
  36. package/dist/install/transaction.js +1913 -19
  37. package/dist/install/ui.js +1910 -15
  38. package/dist/installation.js +133 -10
  39. package/dist/launcher.js +108 -4
  40. package/dist/output.d.ts +3 -0
  41. package/dist/output.d.ts.map +1 -1
  42. package/dist/output.js +11 -1
  43. package/dist/output.js.map +1 -1
  44. package/dist/preflight.d.ts +5 -0
  45. package/dist/preflight.d.ts.map +1 -1
  46. package/dist/preflight.js +14 -12
  47. package/dist/preflight.js.map +1 -1
  48. package/dist/project/eligibility.js +1917 -22
  49. package/dist/project/records.js +121 -8
  50. package/dist/project.d.ts +15 -0
  51. package/dist/project.d.ts.map +1 -1
  52. package/dist/project.js +229 -15
  53. package/dist/project.js.map +1 -1
  54. package/dist/router.d.ts +2 -0
  55. package/dist/router.d.ts.map +1 -1
  56. package/dist/router.js +2164 -122
  57. package/dist/router.js.map +1 -1
  58. package/dist/runtime/releaseSource.d.ts +6 -0
  59. package/dist/runtime/releaseSource.d.ts.map +1 -1
  60. package/dist/runtime/releaseSource.js +1933 -32
  61. package/dist/runtime/releaseSource.js.map +1 -1
  62. package/dist/runtime/selfUpdate.js +1809 -8
  63. package/dist/runtime/signers.js +28 -9
  64. package/dist/runtime/store.js +18 -6
  65. package/dist/runtime/updateCheck.d.ts +4 -0
  66. package/dist/runtime/updateCheck.d.ts.map +1 -0
  67. package/dist/runtime/updateCheck.js +6695 -0
  68. package/dist/runtime/updateCheck.js.map +1 -0
  69. package/dist/sbom.json +21 -21
  70. package/dist/scanner/control.d.ts +27 -1
  71. package/dist/scanner/control.d.ts.map +1 -1
  72. package/dist/scanner/control.js +207 -36
  73. package/dist/scanner/control.js.map +1 -1
  74. package/dist/scanner/discover.d.ts +5 -0
  75. package/dist/scanner/discover.d.ts.map +1 -1
  76. package/dist/scanner/discover.js +16 -6
  77. package/dist/scanner/discover.js.map +1 -1
  78. package/dist/scanner/enable.d.ts +2 -0
  79. package/dist/scanner/enable.d.ts.map +1 -1
  80. package/dist/scanner/enable.js +152 -14
  81. package/dist/scanner/enable.js.map +1 -1
  82. package/dist/scanner/picker.d.ts.map +1 -1
  83. package/dist/scanner/picker.js +5 -6
  84. package/dist/scanner/picker.js.map +1 -1
  85. package/dist/scanner/service.d.ts +2 -0
  86. package/dist/scanner/service.d.ts.map +1 -1
  87. package/dist/scanner/service.js +279 -54
  88. package/dist/scanner/service.js.map +1 -1
  89. package/dist/scanner/update.d.ts +8 -0
  90. package/dist/scanner/update.d.ts.map +1 -1
  91. package/dist/scanner/update.js +254 -20
  92. package/dist/scanner/update.js.map +1 -1
  93. package/dist/scanner-release.json +35 -30
  94. package/dist/screens/journey.d.ts +6 -1
  95. package/dist/screens/journey.d.ts.map +1 -1
  96. package/dist/screens/journey.js +29 -8
  97. package/dist/screens/journey.js.map +1 -1
  98. package/dist/status.d.ts +21 -0
  99. package/dist/status.d.ts.map +1 -1
  100. package/dist/status.js +1993 -39
  101. package/dist/status.js.map +1 -1
  102. package/dist/vendor/local-setup.js +256 -29
  103. package/dist/vendor/shared/runtimeSigners.js +38 -11
  104. package/package.json +31 -31
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["../../src/runtime/updateCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;AAElF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,MAAsC,EACtC,GAAG,GAAiB,IAAI,CAAC,GAAG;IAE5B,MAAM,KAAK,GAAyB,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC;IACzF,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,iFAAiF;IACnF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAY,CAAC;QACvF,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAkC,CAAC;QAC7E,IACE,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE1D,OAAO,SAAS,CAAC;QACnB,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAwC,EAAE,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
package/dist/sbom.json CHANGED
@@ -17,13 +17,13 @@
17
17
  }
18
18
  ],
19
19
  "component": {
20
- "bom-ref": "@mnemonik/cli@0.1.61",
20
+ "bom-ref": "@mnemonik/cli@0.1.62",
21
21
  "type": "library",
22
22
  "name": "@mnemonik/cli",
23
- "version": "0.1.61",
23
+ "version": "0.1.62",
24
24
  "scope": "required",
25
25
  "description": "Mnemonik installer and local project helper",
26
- "purl": "pkg:npm/%40mnemonik/cli@0.1.61",
26
+ "purl": "pkg:npm/%40mnemonik/cli@0.1.62",
27
27
  "properties": [],
28
28
  "externalReferences": [
29
29
  {
@@ -35,12 +35,12 @@
35
35
  },
36
36
  "components": [
37
37
  {
38
- "bom-ref": "@mnemonik/credentials@0.1.61",
38
+ "bom-ref": "@mnemonik/credentials@0.1.62",
39
39
  "type": "library",
40
40
  "name": "@mnemonik/credentials",
41
- "version": "0.1.61",
41
+ "version": "0.1.62",
42
42
  "scope": "required",
43
- "purl": "pkg:npm/%40mnemonik/credentials@0.1.61",
43
+ "purl": "pkg:npm/%40mnemonik/credentials@0.1.62",
44
44
  "properties": [],
45
45
  "externalReferences": [
46
46
  {
@@ -50,12 +50,12 @@
50
50
  ]
51
51
  },
52
52
  {
53
- "bom-ref": "@mnemonik/local-setup@0.1.61",
53
+ "bom-ref": "@mnemonik/local-setup@0.1.62",
54
54
  "type": "library",
55
55
  "name": "@mnemonik/local-setup",
56
- "version": "0.1.61",
56
+ "version": "0.1.62",
57
57
  "scope": "required",
58
- "purl": "pkg:npm/%40mnemonik/local-setup@0.1.61",
58
+ "purl": "pkg:npm/%40mnemonik/local-setup@0.1.62",
59
59
  "properties": [],
60
60
  "externalReferences": [
61
61
  {
@@ -65,14 +65,14 @@
65
65
  ]
66
66
  },
67
67
  {
68
- "bom-ref": "@mnemonik/shared@7.109.3",
68
+ "bom-ref": "@mnemonik/shared@7.110.0",
69
69
  "type": "library",
70
70
  "name": "@mnemonik/shared",
71
- "version": "7.109.3",
71
+ "version": "7.110.0",
72
72
  "scope": "required",
73
73
  "author": "Anthony",
74
74
  "description": "Shared constants and utilities for Mnemonik packages",
75
- "purl": "pkg:npm/%40mnemonik/shared@7.109.3",
75
+ "purl": "pkg:npm/%40mnemonik/shared@7.110.0",
76
76
  "properties": [],
77
77
  "externalReferences": [
78
78
  {
@@ -271,29 +271,29 @@
271
271
  ],
272
272
  "dependencies": [
273
273
  {
274
- "ref": "@mnemonik/cli@0.1.61",
274
+ "ref": "@mnemonik/cli@0.1.62",
275
275
  "dependsOn": [
276
- "@mnemonik/credentials@0.1.61",
277
- "@mnemonik/local-setup@0.1.61",
278
- "@mnemonik/shared@7.109.3",
276
+ "@mnemonik/credentials@0.1.62",
277
+ "@mnemonik/local-setup@0.1.62",
278
+ "@mnemonik/shared@7.110.0",
279
279
  "smol-toml@1.8.0"
280
280
  ]
281
281
  },
282
282
  {
283
- "ref": "@mnemonik/credentials@0.1.61",
283
+ "ref": "@mnemonik/credentials@0.1.62",
284
284
  "dependsOn": [
285
- "@mnemonik/local-setup@0.1.61"
285
+ "@mnemonik/local-setup@0.1.62"
286
286
  ]
287
287
  },
288
288
  {
289
- "ref": "@mnemonik/local-setup@0.1.61",
289
+ "ref": "@mnemonik/local-setup@0.1.62",
290
290
  "dependsOn": [
291
- "@mnemonik/shared@7.109.3",
291
+ "@mnemonik/shared@7.110.0",
292
292
  "proper-lockfile@4.1.2"
293
293
  ]
294
294
  },
295
295
  {
296
- "ref": "@mnemonik/shared@7.109.3",
296
+ "ref": "@mnemonik/shared@7.110.0",
297
297
  "dependsOn": [
298
298
  "ignore@7.0.6",
299
299
  "web-tree-sitter@0.26.13"
@@ -40,8 +40,34 @@ export interface ScannerReceipt {
40
40
  files: number;
41
41
  issue: string;
42
42
  }>;
43
+ /** The scanner's last failure until it recovers; `cause` is the line it logged. */
44
+ failure?: {
45
+ kind: string;
46
+ at: string;
47
+ cause: string;
48
+ /** push_rejected: the server's stated reason. */
49
+ reason?: string;
50
+ /** watcher_error: the project's name. */
51
+ project?: string;
52
+ } | null;
43
53
  };
44
54
  }
55
+ /** The scanner paused itself because its saved consent does not cover it. */
56
+ export declare function pausedForConsent(receipt: ScannerReceipt | null | undefined): boolean;
45
57
  export declare function scannerReceipt(stateDir: string): Promise<ScannerReceipt | null>;
46
- export declare function controlScanner(action: 'pause' | 'resume' | 'stop', options: ScannerServiceOptions): Promise<ScannerReceipt>;
58
+ /** The install run that paused the scanner, so a later command can tell when it is gone. */
59
+ export interface PauseOwner {
60
+ /** The install journal's run id. */
61
+ session: string;
62
+ pid: number;
63
+ at: number;
64
+ }
65
+ export declare const ABANDONED_PAUSE_RESUMED = "Background indexing was paused by an installation that did not finish. Mnemonik resumed it.";
66
+ export declare function controlScanner(action: 'pause' | 'resume' | 'stop', options: ScannerServiceOptions, owner?: PauseOwner): Promise<ScannerReceipt>;
67
+ /**
68
+ * An install pauses a running scanner while it works and resumes it when it
69
+ * stops. One that died on the way leaves the pause behind, and nothing else
70
+ * would undo it. A pause a person chose carries no owner and is left alone.
71
+ */
72
+ export declare function resumeAbandonedPause(options: ScannerServiceOptions): Promise<boolean>;
47
73
  //# sourceMappingURL=control.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/scanner/control.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QACR,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;YACnB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,cAAc,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;aAAE,CAAC,CAAC;YAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,EAAE;YAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC;QAC1C,cAAc,CAAC,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC;QAClD,SAAS,CAAC,EAAE;YACV,UAAU,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;YAC7C,YAAY,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;SAChD,CAAC;QACF,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,mFAAmF;QACnF,cAAc,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3E,CAAC;CACH;AACD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAIrF;AACD,wBAAsB,cAAc,CAClC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,EACnC,OAAO,EAAE,qBAAqB,2BAuB/B"}
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/scanner/control.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QACR,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;YACnB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,cAAc,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;aAAE,CAAC,CAAC;YAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,EAAE;YAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC;QAC1C,cAAc,CAAC,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC;QAClD,SAAS,CAAC,EAAE;YACV,UAAU,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;YAC7C,YAAY,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;SAChD,CAAC;QACF,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,mFAAmF;QACnF,cAAc,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC1E,mFAAmF;QACnF,OAAO,CAAC,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,EAAE,MAAM,CAAC;YACX,KAAK,EAAE,MAAM,CAAC;YACd,iDAAiD;YACjD,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,yCAAyC;YACzC,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,GAAG,IAAI,CAAC;KACV,CAAC;CACH;AACD,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAKpF;AACD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAIrF;AACD,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AACD,eAAO,MAAM,uBAAuB,gGAC2D,CAAC;AAGhG,wBAAsB,cAAc,CAClC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,EACnC,OAAO,EAAE,qBAAqB,EAC9B,KAAK,CAAC,EAAE,UAAU,2BAOnB;AA8CD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CA4B3F"}
@@ -516,8 +516,25 @@ function readIdentity(stdout) {
516
516
  throw new Error("acl_identity_unavailable");
517
517
  return { name: match[1], sid: match[2] };
518
518
  }
519
+ function* readWindowsIdentity() {
520
+ const user = readIdentity(yield [windowsCommand("whoami.exe"), identityArgs]);
521
+ if (!ADMINISTRATOR_RID.test(user.sid))
522
+ return user;
523
+ const groups = yield [windowsCommand("whoami.exe"), groupArgs];
524
+ const local = /^"[^"\r\n]*","[^"\r\n]*","S-1-5-113",/m.test(groups);
525
+ return {
526
+ ...user,
527
+ localAdministratorSid: local ? `${user.sid.slice(0, user.sid.lastIndexOf("-"))}-500` : null
528
+ };
529
+ }
519
530
  function windowsCurrentAccountSync() {
520
- return currentIdentity ??= readIdentity(hookExecuteSync(windowsCommand("whoami.exe"), identityArgs));
531
+ if (currentIdentity)
532
+ return currentIdentity;
533
+ const commands = readWindowsIdentity();
534
+ let step = commands.next();
535
+ while (!step.done)
536
+ step = commands.next(hookExecuteSync(...step.value));
537
+ return currentIdentity = step.value;
521
538
  }
522
539
  function hookInvocation(file, args2) {
523
540
  if (win32.basename(file) === "whoami.exe") {
@@ -537,11 +554,13 @@ function hookExecuteSync(file, args2, input) {
537
554
  [file, args2] = hookInvocation(file, args2);
538
555
  return execFileSync(file, args2, { ...hookOptions(file, args2), input });
539
556
  }
540
- var identityArgs, currentIdentity, ttl, hookOptions;
557
+ var identityArgs, groupArgs, ADMINISTRATOR_RID, currentIdentity, ttl, hookOptions;
541
558
  var init_runtimeSigners = __esm({
542
559
  "packages/shared/dist/runtimeSigners.js"() {
543
560
  "use strict";
544
561
  identityArgs = ["/user", "/fo", "csv", "/nh"];
562
+ groupArgs = ["/groups", "/fo", "csv", "/nh"];
563
+ ADMINISTRATOR_RID = /^S-1-5-21-\d+-\d+-\d+-500$/;
545
564
  ttl = 10 * 6e4;
546
565
  hookOptions = (file, args2) => ({
547
566
  encoding: args2.includes("/u") ? "utf16le" : "utf8",
@@ -1824,11 +1843,11 @@ var require_mtime_precision = __commonJS({
1824
1843
  function probe(file, fs3, callback) {
1825
1844
  const cachedPrecision = fs3[cacheSymbol];
1826
1845
  if (cachedPrecision) {
1827
- return fs3.stat(file, (err2, stat) => {
1846
+ return fs3.stat(file, (err2, stat2) => {
1828
1847
  if (err2) {
1829
1848
  return callback(err2);
1830
1849
  }
1831
- callback(null, stat.mtime, cachedPrecision);
1850
+ callback(null, stat2.mtime, cachedPrecision);
1832
1851
  });
1833
1852
  }
1834
1853
  const mtime = new Date(Math.ceil(Date.now() / 1e3) * 1e3 + 5);
@@ -1836,13 +1855,13 @@ var require_mtime_precision = __commonJS({
1836
1855
  if (err2) {
1837
1856
  return callback(err2);
1838
1857
  }
1839
- fs3.stat(file, (err3, stat) => {
1858
+ fs3.stat(file, (err3, stat2) => {
1840
1859
  if (err3) {
1841
1860
  return callback(err3);
1842
1861
  }
1843
- const precision = stat.mtime.getTime() % 1e3 === 0 ? "s" : "ms";
1862
+ const precision = stat2.mtime.getTime() % 1e3 === 0 ? "s" : "ms";
1844
1863
  Object.defineProperty(fs3, cacheSymbol, { value: precision });
1845
- callback(null, stat.mtime, precision);
1864
+ callback(null, stat2.mtime, precision);
1846
1865
  });
1847
1866
  });
1848
1867
  }
@@ -1896,14 +1915,14 @@ var require_lockfile = __commonJS({
1896
1915
  if (options.stale <= 0) {
1897
1916
  return callback(Object.assign(new Error("Lock file is already being held"), { code: "ELOCKED", file }));
1898
1917
  }
1899
- options.fs.stat(lockfilePath, (err3, stat) => {
1918
+ options.fs.stat(lockfilePath, (err3, stat2) => {
1900
1919
  if (err3) {
1901
1920
  if (err3.code === "ENOENT") {
1902
1921
  return acquireLock(file, { ...options, stale: 0 }, callback);
1903
1922
  }
1904
1923
  return callback(err3);
1905
1924
  }
1906
- if (!isLockStale(stat, options)) {
1925
+ if (!isLockStale(stat2, options)) {
1907
1926
  return callback(Object.assign(new Error("Lock file is already being held"), { code: "ELOCKED", file }));
1908
1927
  }
1909
1928
  removeLock(file, options, (err4) => {
@@ -1915,8 +1934,8 @@ var require_lockfile = __commonJS({
1915
1934
  });
1916
1935
  });
1917
1936
  }
1918
- function isLockStale(stat, options) {
1919
- return stat.mtime.getTime() < Date.now() - options.stale;
1937
+ function isLockStale(stat2, options) {
1938
+ return stat2.mtime.getTime() < Date.now() - options.stale;
1920
1939
  }
1921
1940
  function removeLock(file, options, callback) {
1922
1941
  options.fs.rmdir(getLockFile(file, options), (err2) => {
@@ -1934,7 +1953,7 @@ var require_lockfile = __commonJS({
1934
1953
  lock2.updateDelay = lock2.updateDelay || options.update;
1935
1954
  lock2.updateTimeout = setTimeout(() => {
1936
1955
  lock2.updateTimeout = null;
1937
- options.fs.stat(lock2.lockfilePath, (err2, stat) => {
1956
+ options.fs.stat(lock2.lockfilePath, (err2, stat2) => {
1938
1957
  const isOverThreshold = lock2.lastUpdate + options.stale < Date.now();
1939
1958
  if (err2) {
1940
1959
  if (err2.code === "ENOENT" || isOverThreshold) {
@@ -1943,7 +1962,7 @@ var require_lockfile = __commonJS({
1943
1962
  lock2.updateDelay = 1e3;
1944
1963
  return updateLock(file, options);
1945
1964
  }
1946
- const isMtimeOurs = lock2.mtime.getTime() === stat.mtime.getTime();
1965
+ const isMtimeOurs = lock2.mtime.getTime() === stat2.mtime.getTime();
1947
1966
  if (!isMtimeOurs) {
1948
1967
  return setLockAsCompromised(
1949
1968
  file,
@@ -2068,11 +2087,11 @@ var require_lockfile = __commonJS({
2068
2087
  if (err2) {
2069
2088
  return callback(err2);
2070
2089
  }
2071
- options.fs.stat(getLockFile(file2, options), (err3, stat) => {
2090
+ options.fs.stat(getLockFile(file2, options), (err3, stat2) => {
2072
2091
  if (err3) {
2073
2092
  return err3.code === "ENOENT" ? callback(null, false) : callback(err3);
2074
2093
  }
2075
- return callback(null, !isLockStale(stat, options));
2094
+ return callback(null, !isLockStale(stat2, options));
2076
2095
  });
2077
2096
  });
2078
2097
  }
@@ -6391,17 +6410,18 @@ var WINDOWS_SERVICE_BUDGET_MS = 12e4;
6391
6410
 
6392
6411
  // packages/cli/src/scanner/control.ts
6393
6412
  import { randomUUID as randomUUID2 } from "node:crypto";
6394
- import { readFile as readFile2 } from "node:fs/promises";
6395
- import { join as join4 } from "node:path";
6413
+ import { readFile as readFile2, stat } from "node:fs/promises";
6414
+ import { join as join5 } from "node:path";
6396
6415
  import { setTimeout as delay2 } from "node:timers/promises";
6397
6416
 
6398
6417
  // packages/local-setup/dist/storage.js
6399
6418
  init_hookRuntime();
6419
+ init_hookRuntime();
6400
6420
  import { createHash, randomUUID } from "node:crypto";
6401
6421
  import { execFile as nodeExecFile } from "node:child_process";
6402
6422
  import fs2 from "node:fs";
6403
6423
  import { open, rename, readFile, mkdir, lstat, chmod, writeFile, unlink, rmdir } from "node:fs/promises";
6404
- init_hookRuntime();
6424
+ import { homedir } from "node:os";
6405
6425
  import { dirname as dirname3, join as join3, win32 as win322, posix } from "node:path";
6406
6426
  import { setTimeout as delay } from "node:timers/promises";
6407
6427
  var lockfileKey = /* @__PURE__ */ Symbol.for("mnemonik.proper-lockfile");
@@ -6410,6 +6430,15 @@ function sharedLockfile() {
6410
6430
  return shared[lockfileKey] ??= Promise.resolve().then(() => __toESM(require_proper_lockfile(), 1)).then((module2) => module2.default);
6411
6431
  }
6412
6432
  var codeIs = (error, code) => error.code === code;
6433
+ function stateDirectory(platform = process.platform, env = process.env, home = homedir()) {
6434
+ if (env.MNEMONIK_STATE_DIR)
6435
+ return env.MNEMONIK_STATE_DIR;
6436
+ if (platform === "win32")
6437
+ return win322.join(env.LOCALAPPDATA || win322.join(home, "AppData", "Local"), "Mnemonik");
6438
+ if (platform === "darwin")
6439
+ return posix.join(home, "Library", "Application Support", "Mnemonik");
6440
+ return posix.join(env.XDG_STATE_HOME || posix.join(home, ".local", "state"), "mnemonik");
6441
+ }
6413
6442
  async function readBytes(path) {
6414
6443
  try {
6415
6444
  if (!(await lstat(path)).isFile())
@@ -6547,37 +6576,179 @@ async function withLock(path, waitMs, work) {
6547
6576
  }
6548
6577
  }
6549
6578
 
6579
+ // packages/local-setup/dist/automaticUpdate.js
6580
+ import { spawn as nodeSpawn } from "node:child_process";
6581
+ import { realpathSync } from "node:fs";
6582
+ import { stat as nodeStat, utimes } from "node:fs/promises";
6583
+ import { homedir as homedir2 } from "node:os";
6584
+ import { join as join4 } from "node:path";
6585
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
6586
+ var DAY_MS = 864e5;
6587
+ var statePath = (stateDir) => join4(stateDir, "automatic-update.json");
6588
+ function cliLauncherPath(options = {}) {
6589
+ const platform = options.platform ?? process.platform;
6590
+ const home = options.home ?? homedir2();
6591
+ return platform === "win32" ? join4(options.env?.LOCALAPPDATA || join4(home, "AppData", "Local"), "Mnemonik", "bin", "mnemonik.cmd") : join4(home, ".local", "bin", "mnemonik");
6592
+ }
6593
+ async function readState(path) {
6594
+ const bytes = await readBytes(path);
6595
+ if (!bytes)
6596
+ return {};
6597
+ const value = JSON.parse(bytes.toString());
6598
+ if (!value || typeof value !== "object" || value.lastAttempt !== void 0 && (!Number.isFinite(value.lastAttempt) || value.lastAttempt < 0))
6599
+ throw new Error("automatic_update_state_invalid");
6600
+ return value.lastAttempt === void 0 ? {} : { lastAttempt: value.lastAttempt };
6601
+ }
6602
+ async function maybeStartAutomaticUpdate(options = {}) {
6603
+ const stateDir = options.stateDir ?? stateDirectory(options.platform, options.env, options.home);
6604
+ const path = statePath(stateDir);
6605
+ try {
6606
+ const now = (options.now ?? Date.now)();
6607
+ const stat2 = options.stat ?? nodeStat;
6608
+ try {
6609
+ if (now - (await stat2(path)).mtimeMs < DAY_MS)
6610
+ return false;
6611
+ } catch (error) {
6612
+ if (error.code !== "ENOENT")
6613
+ throw error;
6614
+ }
6615
+ if (!options.spawn && !(await stat2(cliLauncherPath(options))).isFile())
6616
+ return false;
6617
+ return await withLock(path, 0, async (assertOwned) => {
6618
+ const state = await readState(path);
6619
+ if (state.lastAttempt !== void 0 && now - state.lastAttempt < DAY_MS)
6620
+ return false;
6621
+ await atomicWrite(path, Buffer.from(`${JSON.stringify({ lastAttempt: now })}
6622
+ `), void 0, assertOwned);
6623
+ await utimes(path, now / 1e3, now / 1e3);
6624
+ const platform = options.platform ?? process.platform;
6625
+ const launcher = cliLauncherPath(options);
6626
+ const command = platform === "win32" ? {
6627
+ file: options.env?.ComSpec || "cmd.exe",
6628
+ args: ["/d", "/s", "/c", `""${launcher}" update --automatic"`],
6629
+ windowsVerbatimArguments: true
6630
+ } : platform === "linux" && (options.env ?? process.env).INVOCATION_ID ? {
6631
+ // detached creates a process group, not a new systemd cgroup. An
6632
+ // updater spawned by the scanner must survive stopping that service.
6633
+ file: "systemd-run",
6634
+ args: [
6635
+ "--user",
6636
+ "--collect",
6637
+ "--quiet",
6638
+ `--setenv=MNEMONIK_STATE_DIR=${stateDir}`,
6639
+ "--",
6640
+ launcher,
6641
+ "update",
6642
+ "--automatic"
6643
+ ]
6644
+ } : { file: launcher, args: ["update", "--automatic"] };
6645
+ const child = (options.spawn ?? nodeSpawn)(command.file, command.args, {
6646
+ detached: true,
6647
+ stdio: "ignore",
6648
+ windowsHide: true,
6649
+ ..."windowsVerbatimArguments" in command ? { windowsVerbatimArguments: command.windowsVerbatimArguments } : {}
6650
+ });
6651
+ child.once("error", () => {
6652
+ });
6653
+ child.unref();
6654
+ return true;
6655
+ });
6656
+ } catch {
6657
+ return false;
6658
+ }
6659
+ }
6660
+ var HELPER_FLAG = "--mnemonik-automatic-update";
6661
+ function isHelperInvocation() {
6662
+ if (process.argv[2] !== HELPER_FLAG || !process.argv[3] || !process.argv[1])
6663
+ return false;
6664
+ try {
6665
+ return realpathSync(process.argv[1]) === realpathSync(fileURLToPath2(import.meta.url));
6666
+ } catch {
6667
+ return false;
6668
+ }
6669
+ }
6670
+ if (isHelperInvocation())
6671
+ void maybeStartAutomaticUpdate({ stateDir: process.argv[3] });
6672
+
6550
6673
  // packages/local-setup/dist/index.js
6551
6674
  var MAX_ORIGINAL_BYTES = 64 * 1024;
6552
6675
 
6553
6676
  // packages/cli/src/scanner/control.ts
6554
6677
  import { scannerService } from "./service.js";
6678
+ function pausedForConsent(receipt) {
6679
+ return receipt?.snapshot.lifecycle.state === "paused" && receipt.snapshot.lifecycle.reason === "consent_required";
6680
+ }
6555
6681
  async function scannerReceipt(stateDir) {
6556
6682
  return JSON.parse(
6557
- await readFile2(join4(stateDir, "scanner/status.json"), "utf8").catch(() => "null")
6683
+ await readFile2(join5(stateDir, "scanner/status.json"), "utf8").catch(() => "null")
6558
6684
  );
6559
6685
  }
6560
- async function controlScanner(action, options) {
6561
- const supervisor = await scannerService(options).status();
6562
- if (!supervisor.running || !supervisor.pid) throw new Error("scanner_not_running");
6563
- return withLock(join4(options.stateDir, "scanner/control"), 5e3, async () => {
6564
- const id = randomUUID2();
6565
- await atomicWrite(
6566
- join4(options.stateDir, "scanner/control.json"),
6567
- Buffer.from(JSON.stringify({ id, action }))
6686
+ var ABANDONED_PAUSE_RESUMED = "Background indexing was paused by an installation that did not finish. Mnemonik resumed it.";
6687
+ var INSTALL_LEASE_STALE_MS = 3e4;
6688
+ async function controlScanner(action, options, owner) {
6689
+ const { running, pid } = await scannerService(options).status();
6690
+ if (!running || !pid) throw new Error("scanner_not_running");
6691
+ return withLock(
6692
+ join5(options.stateDir, "scanner/control"),
6693
+ 5e3,
6694
+ () => sendControl(action, options, pid, owner)
6695
+ );
6696
+ }
6697
+ async function sendControl(action, options, pid, owner) {
6698
+ const id = randomUUID2();
6699
+ await atomicWrite(
6700
+ join5(options.stateDir, "scanner/control.json"),
6701
+ Buffer.from(JSON.stringify({ id, action, ...owner ? { owner } : {} }))
6702
+ );
6703
+ const now = options.now ?? Date.now;
6704
+ const deadline = now() + (process.platform === "win32" ? WINDOWS_SERVICE_BUDGET_MS / 4 : 1e4);
6705
+ do {
6706
+ const receipt = await scannerReceipt(options.stateDir);
6707
+ if (receipt?.snapshot.lifecycle.pid === pid && receipt.snapshot.lifecycle.controlId === id)
6708
+ return receipt;
6709
+ await (options.sleep ?? delay2)(100);
6710
+ } while (now() < deadline);
6711
+ throw new Error("scanner_control_timeout");
6712
+ }
6713
+ var readControl = async (stateDir) => JSON.parse(
6714
+ await readFile2(join5(stateDir, "scanner/control.json"), "utf8").catch(() => "null")
6715
+ );
6716
+ async function installerAlive(stateDir, owner) {
6717
+ if (typeof owner.pid !== "number" || typeof owner.session !== "string") return false;
6718
+ try {
6719
+ process.kill(owner.pid, 0);
6720
+ } catch (error) {
6721
+ if (error.code !== "EPERM") return false;
6722
+ }
6723
+ const lease = await stat(join5(stateDir, "install-owner.json.lock")).catch(() => null);
6724
+ if (!lease || Date.now() - lease.mtimeMs > INSTALL_LEASE_STALE_MS) return false;
6725
+ const current = JSON.parse(
6726
+ await readFile2(join5(stateDir, "install-owner.json"), "utf8").catch(() => "{}")
6727
+ );
6728
+ return current.runId === owner.session;
6729
+ }
6730
+ async function resumeAbandonedPause(options) {
6731
+ const request = await readControl(options.stateDir);
6732
+ if (request?.action !== "pause" || !request.owner) return false;
6733
+ if (await installerAlive(options.stateDir, request.owner)) return false;
6734
+ const supervisor = await scannerService(options).status().catch(() => void 0);
6735
+ const pid = supervisor?.running ? supervisor.pid : null;
6736
+ if (!pid) return false;
6737
+ const lifecycle = (await scannerReceipt(options.stateDir))?.snapshot.lifecycle;
6738
+ if (lifecycle?.pid !== pid || lifecycle.state !== "paused" || lifecycle.controlId !== request.id && (lifecycle.controlId !== void 0 || lifecycle.reason !== "pause_restored"))
6739
+ return false;
6740
+ return withLock(join5(options.stateDir, "scanner/control"), 5e3, async () => {
6741
+ if ((await readControl(options.stateDir))?.id !== request.id) return false;
6742
+ return sendControl("resume", options, pid).then(
6743
+ () => true,
6744
+ () => false
6568
6745
  );
6569
- const now = options.now ?? Date.now;
6570
- const deadline = now() + (process.platform === "win32" ? WINDOWS_SERVICE_BUDGET_MS / 4 : 1e4);
6571
- do {
6572
- const receipt = await scannerReceipt(options.stateDir);
6573
- if (receipt?.snapshot.lifecycle.pid === supervisor.pid && receipt.snapshot.lifecycle.controlId === id)
6574
- return receipt;
6575
- await (options.sleep ?? delay2)(100);
6576
- } while (now() < deadline);
6577
- throw new Error("scanner_control_timeout");
6578
6746
  });
6579
6747
  }
6580
6748
  export {
6749
+ ABANDONED_PAUSE_RESUMED,
6581
6750
  controlScanner,
6751
+ pausedForConsent,
6752
+ resumeAbandonedPause,
6582
6753
  scannerReceipt
6583
6754
  };
@@ -1 +1 @@
1
- {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/scanner/control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAA8B,MAAM,cAAc,CAAC;AA4B1E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CACzD,CAAC;AAC7B,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAmC,EACnC,OAA8B;IAE9B,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACnF,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,WAAW,CACf,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC,EAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAC5C,CAAC;QACF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChG,GAAG,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvD,IACE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG;gBAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,KAAK,EAAE;gBAE3C,OAAO,OAAO,CAAC;YACjB,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/scanner/control.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@ export interface DiscoveredRepository {
9
9
  state: RepositoryState;
10
10
  /** What is on disk, for display only. Git history is optional, never a condition. */
11
11
  kind?: 'git' | 'folder';
12
+ /** The project its `.mnemonik.json` names. A folder with one is a project, git or not. */
13
+ projectId?: string;
12
14
  fingerprint?: RepositoryFingerprint;
13
15
  reason?: Exclude<ProjectIdentityResolution['kind'], 'ok' | 'absent'>;
14
16
  }
@@ -16,6 +18,8 @@ export interface ScannerCandidate {
16
18
  path: string;
17
19
  name: string;
18
20
  kind: 'git' | 'folder';
21
+ /** Lets the server tell an already-connected project from a new folder. */
22
+ projectId?: string;
19
23
  }
20
24
  export type DiscoveryResult = {
21
25
  status: 'complete' | 'list_truncated';
@@ -42,6 +46,7 @@ export declare function scannerCandidates(boundary: string): Promise<{
42
46
  repositories: DiscoveredRepository[];
43
47
  omitted: number;
44
48
  }>;
49
+ export declare const scannerCandidate: (root: string, repository: DiscoveredRepository) => ScannerCandidate;
45
50
  export declare function guessDiscoveryBoundary(cwd: string, home: string): Promise<string>;
46
51
  export declare const repositoryName: (root: string, path: string) => string;
47
52
  export declare const repositoryStateLabel: (state: RepositoryState) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/scanner/discover.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EACL,sBAAsB,EAEtB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,eAAe,QAAS,CAAC;AACtC,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,MAAM,MAAM,eAAe,GACzB,kBAAkB,GAAG,cAAc,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAEzE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,qFAAqF;IACrF,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,UAAU,gBAAgB;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,eAAe,CAAC,EAAE,OAAO,sBAAsB,CAAC;IAChD,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CAC7D;AA2CD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,aAAa,CAAM,GAC3F,OAAO,CAAC,oBAAoB,CAAC,CAoC/B;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CA4E1B;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAYD;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBvF;AAED,eAAO,MAAM,cAAc,SAAU,MAAM,QAAQ,MAAM,KAAG,MACX,CAAC;AAElD,eAAO,MAAM,oBAAoB,UAAW,eAAe,KAAG,MAMnD,CAAC"}
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/scanner/discover.ts"],"names":[],"mappings":"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"}
@@ -5169,7 +5169,12 @@ async function classifyRepository(path, options = {}) {
5169
5169
  );
5170
5170
  const kind = resolution.kind !== "git_unavailable" && resolution.repository.kind === "git" ? "git" : "folder";
5171
5171
  if (resolution.kind === "ok") {
5172
- return { path: resolvedPath, state: "existing_project", kind };
5172
+ return {
5173
+ path: resolvedPath,
5174
+ state: "existing_project",
5175
+ kind,
5176
+ projectId: resolution.identity.projectId
5177
+ };
5173
5178
  }
5174
5179
  if (resolution.kind !== "absent") {
5175
5180
  return { path: resolvedPath, state: "action_required", kind, reason: resolution.kind };
@@ -5260,13 +5265,17 @@ async function scannerCandidates(boundary) {
5260
5265
  boundary: discovered.root,
5261
5266
  repositories: discovered.repositories,
5262
5267
  omitted: discovered.omitted,
5263
- candidates: discovered.repositories.map((repository) => ({
5264
- path: repository.path,
5265
- name: repositoryName(discovered.root, repository.path),
5266
- kind: repository.kind ?? "git"
5267
- }))
5268
+ candidates: discovered.repositories.map(
5269
+ (repository) => scannerCandidate(discovered.root, repository)
5270
+ )
5268
5271
  };
5269
5272
  }
5273
+ var scannerCandidate = (root, repository) => ({
5274
+ path: repository.path,
5275
+ name: repositoryName(root, repository.path),
5276
+ kind: repository.kind ?? "git",
5277
+ ...repository.projectId ? { projectId: repository.projectId } : {}
5278
+ });
5270
5279
  async function guessDiscoveryBoundary(cwd, home) {
5271
5280
  const current = resolve2(cwd);
5272
5281
  const unsafe = current === resolve2(home) || current === parse(current).root;
@@ -5298,5 +5307,6 @@ export {
5298
5307
  guessDiscoveryBoundary,
5299
5308
  repositoryName,
5300
5309
  repositoryStateLabel,
5310
+ scannerCandidate,
5301
5311
  scannerCandidates
5302
5312
  };